首页 > 解决方案 > 如何在某些类别常见的熊猫中合并交叉表的类别?

问题描述

前段时间我问了这个问题

但这并不包括两个合并类别可能具有共同类别的情况

在那种情况下,我想将类别 A 和 B 合并到 AB 中。如果我有类别 A、B、C 并且我想将 A、B 合并到 AB 并将 B、C 合并到 BC 怎么办?

假设我有数据:

+---+---+
| X | Y |
+---+---+
| A | D |
| B | D |
| B | E |
| B | D |
| A | E |
| C | D |
| C | E |
| B | E |
+---+---+

我希望交叉表看起来像:

+--------+---+---+
|  X/Y   | D | E |
+--------+---+---+
| A or B | 3 | 3 |
| B or C | 3 | 2 |
| C      | 1 | 1 |
+--------+---+---+

标签: pythonpandas

解决方案


我认为您可以使用crosstab所有唯一值,然后通过按索引值中的类别选择来求和值:

df = pd.crosstab(df.X, df.Y)
df.loc['A or B'] = df.loc[['A','B']].sum()
df.loc['B or C'] = df.loc[['C','B']].sum()
df = df.drop(['A','B'])
print (df)
Y       D  E
X           
C       1  1
A or B  3  3
B or C  3  3

编辑:如果想要通用解决方案并不容易,因为有必要重复组,rename例如:

df1 = df[df['X'] == 'B'].assign(X = 'B or C')
df2 = df[df['X'] == 'C']
df = pd.concat([df, df1], ignore_index=True)
df['X'] = df['X'].replace({'A':'A or B', 'B': 'A or B', 'C': 'B or C'})
df = pd.concat([df, df2], ignore_index=True)

df = pd.crosstab(df.X, df.Y)
print (df)
Y       D  E
X           
A or B  3  3
B or C  3  3
C       1  1

推荐阅读