在Pandas中如何在一个数据帧中对两个类别进行分类

2024-09-30 03:25:20 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个pd包括两个分类列150个类别。可能是第^{列中的值,B列中没有出现该值。例如

a = pd.DataFrame({'A':list('bbaba'),  'B':list('cccaa')})
a['A'] = a['A'].astype('category')
a['B'] = a['B'].astype('category')

输出是

^{pr2}$

还有

cat_columns = a.select_dtypes(['category']).columns
a[cat_columns] = a[cat_columns].apply(lambda x: x.cat.codes)
a

输出是

Out[220]: 
   A  B
0  1  1
1  1  1
2  0  1
3  1  0
4  0  0

我的问题是在A列中,b被认为是1,但是在B列中,c被认为是{}。不过,我想要这样的东西:

Out[220]: 
   A  B
0  1  2
1  1  2
2  0  2
3  1  0
4  0  0

{{cd7}被认为是

请注意,我有150个不同的标签。在


Tags: columnsdataframe分类out类别selectlistcat
3条回答

使用^{}可以指定类别列表:

In [44]: cats = a[['A','B']].stack().sort_values().unique()

In [45]: cats
Out[45]: array(['a', 'b', 'c'], dtype=object)

In [46]: a['A'] = pd.Categorical(a['A'], categories=cats)

In [47]: a['B'] = pd.Categorical(a['B'], categories=cats)

In [48]: a[cat_columns] = a[cat_columns].apply(lambda x: x.cat.codes)

In [49]: a
Out[49]:
   A  B
0  1  2
1  1  2
2  0  2
3  1  0
4  0  0

如果您对转换为分类代码并能够通过字典访问映射感兴趣,^{}可能更方便。在

跨列via @AlexRiley获取唯一值的算法。在

a = pd.DataFrame({'A':list('bbaba'),  'B':list('cccaa')})

fact = dict(zip(*pd.factorize(pd.unique(a[['A', 'B']].values.ravel('K')))[::-1]))

b = a.applymap(fact.get)

结果:

^{pr2}$

我们可以同时使用pd.factorize。在

pd.DataFrame(
    pd.factorize(a.values.ravel())[0].reshape(a.shape),
    a.index, a.columns
)

   A  B
0  0  1
1  0  1
2  2  1
3  0  2
4  2  2

或者,如果要按排序的类别值进行因式分解,请使用sort=True参数

^{pr2}$

或等同于np.unique

pd.DataFrame(
    np.unique(a.values.ravel(), return_inverse=True)[1].reshape(a.shape),
    a.index, a.columns
)

   A  B
0  1  2
1  1  2
2  0  2
3  1  0
4  0  0

相关问题 更多 >

    热门问题