2017-08-11 63 views
2

分类D型我有两个dataframes具有相同的列名和dtypes,类似于以下:保留在数据帧级联

A    object 
B    category 
C    category 

的分类并不是在每个dataframes相同。

当正常concatinating,熊猫输出:

A    object 
B    object 
C    object 

这是预期行为每the documentation

但是,我希望保留分类并希望将类别合并,所以我尝试了跨数据框中两个分类的列上的union_categorical。 cdfdf是我的两个数据框。

for column in df: 
    if df[column].dtype.name == "category" and cdf[column].dtype.name == "category": 
     print (column) 
     union_categoricals([cdf[column], df[column]], ignore_order=True) 

cdf = pd.concat([cdf,df]) 

这仍然没有提供给我一个分类输出。

+0

您使用的是什么版本的熊猫?我无法复制这种行为。 – C8H10N4O2

+0

0.20.1 - union_categoricals在版本0.19.0中是新增的。 – tom

+0

我得到一个'ValueError:类别concat中的不兼容类别,但我仍然在0.18.1 – C8H10N4O2

回答

1

我不认为这是从文档中完全明显,但你可以做下面的事情。下面是一些样本数据:

df1=pd.DataFrame({'x':pd.Categorical(['dog','cat'])}) 
df2=pd.DataFrame({'x':pd.Categorical(['cat','rat'])}) 

使用union_categoricals1得到一致的类别accros dataframes。如果你需要说服自己这是可行的,请尝试df.x.cat.codes

from pandas.api.types import union_categoricals 

uc = union_categoricals([df1.x,df2.x]) 
df1.x = pd.Categorical(df1.x, categories=uc.categories) 
df2.x = pd.Categorical(df2.x, categories=uc.categories) 

连接并验证dtype是分类的。

df3 = pd.concat([df1,df2]) 

df3.x.dtypes 
category 

正如@ C8H10N4O2所示,您也可以在连接后将对象强制回到分类。老实说,对于较小的数据集,我认为这是最简单的方法。但对于较大的数据帧,使用union_categoricals应该更有效率。

+0

感谢你 - 最终在帧中混合使用强制和联合。 – tom