如何合并熊猫交叉表的类别?

时间:2019-12-20 21:42:43

标签: python pandas

假设我的pandas数据帧具有变量X[A, B, C]的3个类别和变量Y[D,E]的2个类别。我想用类似这样的标签:

+--------+----------------------+-----+
|  X/Y   |          D           |  E  |
+--------+----------------------+-----+
| A or B | count(X=A or B, Y=D) | ... |
| C      | count(X=C),Y=D)      | ... |
+--------+----------------------+-----+

2 个答案:

答案 0 :(得分:2)

这是您要寻找的吗?

import pandas as pd
import numpy as np
x = np.random.choice(['A', 'B', 'C'], size=10)
y = np.random.choice(['D', 'E'], size=10)
df = pd.DataFrame({'X':x, 'Y':y})
df.head()
输出:
    X   Y
0   A   D
1   B   D
2   B   E
3   B   D
4   A   E

数据框修改:

df['X'] = df['X'].apply(lambda x: 'A or B' if x == 'A' or x == 'B' else x)

交叉表应用程序:

pd.crosstab(df.X, df.Y)

输出:

Y       D   E
X       
A or B  1   3
C       4   2

答案 1 :(得分:1)

您可以为此使用pandas.pivot_table()。这应该可以解决问题-df指向输入数据帧。

import numpy as np

df["catX"]=np.where(df["X"].isin(["A","B"]), "AB", np.where(df["X"]=="C", "C", "other"))

df2=df.pivot_table(index="catX", columns="Y", aggfunc='count', values="X")

示例输出:

#input - df with extra categorical column - catX
    X  Y catX
0   A  D   AB
1   B  D   AB
2   C  E    C
3   B  E   AB
4   C  D    C
5   B  D   AB
6   C  D    C
7   A  E   AB
8   A  D   AB
9   A  E   AB
10  C  E    C
11  C  E    C
12  A  E   AB

#result:
Y     D  E
catX
AB    4  4
C     2  3