计算每个熊猫列中的数据出现次数

时间:2018-07-28 17:08:07

标签: python python-3.x pandas

我有以下数据框:

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

将如何获得正确的输出?

1 个答案:

答案 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])

您将获得预期的输出