如何计算所有选择(例如,来自调查)作为列

How to get count of all choices (say, from a survey) as columns

首先让我说一下我是 pandas 的初学者。 我有一个问题,我的初始数据框如下所示。 对于每个问题,我们都会记录 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() 适用于列,但无法正确适用于行。

您可以将 applypd.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