データフレームの連結時にカテゴリ型を保持する 質問する

データフレームの連結時にカテゴリ型を保持する 質問する

次のような、列名と dtype が同じ 2 つのデータフレームがあります。

A             object
B             category
C             category

各データフレームのカテゴリは同一ではありません。

通常の連結の場合、pandas は次のように出力します。

A             object
B             object
C             object

これは期待される動作ですドキュメント

ただし、分類を維持し、カテゴリを結合したいので、データフレーム内のカテゴリである列全体で union_categoricals を試しました。cdfと はdf私の 2 つのデータフレームです。

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

これでもまだカテゴリ出力は得られません。

ベストアンサー1

ドキュメントからは完全には明らかではないと思いますが、次のようなことができます。サンプルデータを以下に示します。

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

union_categoricalsデータフレーム間で一貫したカテゴリを取得するために使用します。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メモリ効率がはるかに高くなります。

おすすめ記事