假设我的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) | ... |
+--------+----------------------+-----+
答案 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