我希望将两个数据框与类别类型列连接起来,首先将缺少的类别添加到每个列中。
df = pd.DataFrame({"a": pd.Categorical(["foo", "foo", "bar"]), "b": [1, 2, 1]})
df2 = pd.DataFrame({"a": pd.Categorical(["baz"]), "b": [1]})
df["a"] = df["a"].cat.add_categories("baz")
df2["a"] = df2["a"].cat.add_categories(["foo", "bar"])
理论上,"a"
列的类别是相同的:
In [33]: df.a.cat.categories
Out[33]: Index(['bar', 'foo', 'baz'], dtype='object')
In [34]: df2.a.cat.categories
Out[34]: Index(['baz', 'foo', 'bar'], dtype='object')
但是,在连接两个数据帧时,我会得到一个object
- 类型"a"
列:
In [35]: pd.concat([df, df2]).info()
<class 'pandas.core.frame.DataFrame'>
Int64Index: 4 entries, 0 to 0
Data columns (total 2 columns):
a 4 non-null object
b 4 non-null int64
dtypes: int64(1), object(1)
memory usage: 96.0+ bytes
在documentation中,它表示当类别相同时,它应该会生成category
- 类型列。即使类别是无序的,类别的顺序是否重要?我正在使用pandas-0.20.3
。
答案 0 :(得分:2)
是。通过使用reorder_categories
,您可以更改类别的顺序,即使类别本身是无序的。
df2["a"] = df2.a.cat.reorder_categories(df.a.cat.categories)
In [43]: pd.concat([df, df2]).info()
<class 'pandas.core.frame.DataFrame'>
Int64Index: 4 entries, 0 to 0
Data columns (total 2 columns):
a 4 non-null category
b 4 non-null int64
dtypes: category(1), int64(1)
memory usage: 172.0 bytes