如何将所有选择(例如,从调查中得出)计数为列

时间:2018-07-28 07:19:43

标签: python pandas count pandas-groupby survey

首先让我说我是熊猫的初学者。 我有一个问题,其中我的初始数据帧如下所示。 对于每个问题,我们都会记录3个答案中的任意一个(是,否或为什么)。

df = pd.DataFrame({'Qn1' : ['Yes', 'No', 'Why', 'No', 'Yes', 'No'],
               'Qn2' : ['No', 'No', 'Yes', 'Why', 'Why', 'Yes'],
               'Qn3' : ['Why', 'Why', 'Why', 'Yes', 'Yes', 'No'],
               'Qn4' : ['No', 'No', 'No', 'Yes', 'Yes', 'Why'],
              })

我们如何获得一个包含每个问题的答案数的数据框。例如:与下一个相似的df

.   Yes  No  Why
Qn1  5   2   1
Qn2  1   3   6
Qn3  0   4   2
Qn4  4   2   1

groupby()适用于列,但无法使其正确地适用于行。

1 个答案:

答案 0 :(得分:2)

您可以将 apply pd.value_counts 一起使用:

df.apply(pd.value_counts).T

     No  Why  Yes
Qn1   3    1    2
Qn2   2    2    2
Qn3   1    3    2
Qn4   3    1    2

如果缺少值,则会用NaN填充,因此,您可以 fillna ,如果可能的话:

df = pd.DataFrame({'Qn1': ['Yes'], 'Qn2': ['No'], 'Qn3': ['Why']})
df.apply(pd.value_counts).T

      No  Why  Yes
Qn1  NaN  NaN  1.0
Qn2  1.0  NaN  NaN
Qn3  NaN  1.0  NaN

# With fillna()
df.apply(pd.value_counts).T.fillna(0).astype(int)

     No  Why  Yes
Qn1   0    0    1
Qn2   1    0    0
Qn3   0    1    0

如果不是所有项目都在 any 列中,则可能需要定义CategoricalDtype

df = pd.DataFrame({'Qn1': ['Yes'], 'Qn2': ['No'], 'Qn3': ['No']})
df.apply(pd.value_counts).T.fillna(0).astype(int)

# Missing 'why'
     No  Yes
Qn1   0    1
Qn2   1    0
Qn3   1    0

但是使用CategoricalDtype

from pandas.api.types import CategoricalDtype

ct_type = CategoricalDtype(categories=['Yes', 'No', 'Why'], ordered=False)

df.astype(ct_type).apply(pd.value_counts).T.fillna(0).astype(int)

     No  Why  Yes
Qn1   0    0    1
Qn2   1    0    0
Qn3   1    0    0