我有以下数据框:
import pandas as pd
df = pd.DataFrame({"E": ["X", "Y", "X", "X", "Y", "X"], "F": ["Y", "Y", "X", "Y", "X","Y"], "G": ["Y", "X", "X", "X", "Y", "X"], "I": ["A", "B", "B", "B", "A", "A"]})
df.set_index("I", drop = True, inplace = True)
print(df)
E F G
I
A X Y Y
B Y Y X
B X X X
B X Y X
A Y X Y
A X Y X
我现在想计算每一列A-X, A-Y, B-X, B-Y
的每个组合E, F, G
的出现,因此预期的输出将是:
E F G
X Y X Y X Y
I
A 2 1 1 2 1 2
B 2 1 1 2 3 0
我知道我可以使用pd.crosstab
来完成一列。所以我可以遍历各列并连接数据帧:
for i, column in enumerate(df.columns):
if i == 0:
df1 = pd.crosstab(df.index, df[column])
else:
df1 = pd.concat([df1, pd.crosstab(df.index, df[column])], axis = 1)
但是,除了迭代感觉不合常规并且我希望有更好的解决方案这一事实之外,索引还丢失了有关初始列的信息:
X Y X Y X Y
row_0
A 2 1 1 2 1 2
B 2 1 1 2 3 0
将如何获得正确的输出?
答案 0 :(得分:1)
您可以在df上使用get_dummies
,然后在索引上使用groupby
,并使用sum
:
df1 = pd.get_dummies(df).groupby(level=0).sum()
您会得到:
E_X E_Y F_X F_Y G_X G_Y
I
A 2 1 1 2 1 2
B 2 1 1 2 3 0
如果您希望该列具有多索引级别,则可以执行以下操作:
df1.columns = pd.MultiIndex.from_tuples([col.split('_') for col in df1.columns])
您将获得预期的输出