Если вы настаиваете на value_counts
, вы можете заранее использовать stack
и groupby
, а затем позвонить value_counts
до unstacking
:
df.stack().groupby(level=[1]).value_counts().unstack(0, fill_value=0)
Q1 Q2 Q3
Agree 0 3 0
Disagree 0 0 1
More or less agree 1 0 0
More or less disagree 0 0 1
Strongly Disagree 0 1 0
Strongly agree 3 0 0
Strongly disagree 0 0 1
Undecided 1 1 2
Другой вариант заключается в использованииmelt
и pivot_table
:
(df.melt()
.pivot_table(columns='variable', index='value', aggfunc='size', fill_value=0))
variable Q1 Q2 Q3
value
Agree 0 3 0
Disagree 0 0 1
More or less agree 1 0 0
More or less disagree 0 0 1
Strongly Disagree 0 1 0
Strongly agree 3 0 0
Strongly disagree 0 0 1
Undecided 1 1 2
Решение с использованием crosstab
:
v = df.melt()
pd.crosstab(v['value'], v['variable'])
variable Q1 Q2 Q3
value
Agree 0 3 0
Disagree 0 0 1
More or less agree 1 0 0
More or less disagree 0 0 1
Strongly Disagree 0 1 0
Strongly agree 3 0 0
Strongly disagree 0 0 1
Undecided 1 1 2