如何计算所有选择(例如,来自调查)作为列
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() 适用于列,但无法正确适用于行。
您可以将 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
首先让我说一下我是 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() 适用于列,但无法正确适用于行。
您可以将 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