如何保持熊猫中所有变量的类别?

时间:2018-11-01 17:18:13

标签: python pandas dataframe

我有一个同时包含数字和分类数据(df1)的数据框。我正在创建一个类似于第一个数据框df2的数据库,这意味着它具有与df1相同的列名和dtypes。但是,除了df1的名称和dtypes之外,我还希望保留分类变量的类别,即使它们在创建时未出现在df2上也是如此。

到目前为止,我找到的最简单的解决方案是遍历df2上的所有分类变量,并添加df1的每个分类变量的类别。但是我相信必须有比我提出的解决方案更快/更有效的解决方案。

df1 = pd.DataFrame({
'A' : pd.Categorical(list('bbeebbaa'), categories=['e','a','b'], ordered=True),
'B' : [1,2,1,2,2,1,2,1],
'C' : pd.Categorical(list('ddeeccaa'), categories=['e','a','d', 'c'], ordered=True)})

df2 = pd.DataFrame({
'A' : pd.Categorical(list('bbeebbbb'), categories=['e', 'b'], ordered=True),
'B' : [1,2,1,2,2,1,2,1],
'C' : pd.Categorical(list('cccccccc'), categories=['c'], ordered=True)})

categorical = ['A', 'B']
for var in categorical:
    df2[var] = df2[var].cat.add_categories(df1[var].cat.categories)

1 个答案:

答案 0 :(得分:0)

如果df2的所有类别都在df1中,则可以使用set_categories()函数。

l = list(df1['A'].cat.categories)
df2['A'] = df2['A'].cat.set_categories(l)

或一行:

df2['A'] = df2['A'].cat.set_categories(list(df1['A'].cat.categories))

如果df1和df2都包含它们唯一的类别,则不确定如何处理-可能与您在此处介绍的方式类似。