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