2017-08-11 45 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