Retención del tipo de categórico en la concatenación del dataframe

Tengo dos marcos de datos con nombres y tipos de columna idénticos, similares a los siguientes:

A object B category C category 

Las categorías no son idénticas en cada uno de los marcos de datos.

Cuando normalmente concatinan, los pandas producen:

 A object B object C object 

Cuál es el comportamiento esperado según la documentación .

Sin embargo, deseo mantener la categorización y deseo unir las categorías, así que he probado las union_categoricals en las columnas en el dataframe que son ambas categóricas. cdf y df son mis dos marcos de datos.

 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]) 

Esto todavía no me proporciona una salida categórica.

No creo que esto sea completamente obvio en la documentación, pero podrías hacer algo como lo siguiente. Aquí hay algunos datos de muestra:

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

Use union_categoricals1 para obtener categorías consistentes en los marcos de datos. Intente df.x.cat.codes si necesita convencerse de que esto funciona.

 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 ) 

Concatenar y verificar que el dtype sea categórico.

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

Como sugiere @ C8H10N4O2, también podría simplemente forzar de los objetos a los categóricos después de concatenar. Honestamente, para conjuntos de datos más pequeños, creo que esa es la mejor manera de hacerlo solo porque es más simple. Pero para marcos de datos más grandes, el uso de union_categoricals debería ser mucho más eficiente en memoria.

La respuesta de JohnE es útil, pero en pandas 0.19.2, union_categoricals solo se puede importar de la siguiente manera: from pandas.types.concat import union_categoricals