Python 3.6:创建数据透视表 table 汇总数据框中多列的值计数

Python 3.6: Creating a pivot table summarizing counts of values for multiple columns in dataframe

我有以下数据框:

df = pd.DataFrame({'X': ['Agree', 'Disagree', 'Agree', 'Neutral', 'Agree','Neutral'],
               'Y': ['Disagree', 'Neutral', 'Agree', 'Disagree', 'Agree', 'Neutral'], 
               'Z': ['Agree', 'Neutral', 'Neutral', 'Disagree', 'Neutral','Neutral']})

我想创建一个 table 汇总每个类别(列)X、Y 和 'Agree'、'Neutral' 和 'Disagree' 的计数Z.

输出应如下所示:

df_answer = pd.DataFrame({'Response': ['Agree', 'Neutral', 'Disagree'],
               'X': [3,2,1],
               'Y': [2,2,2], 
               'Z': [1,4,1]})

我试图找到这个问题的答案,但似乎找不到专门解决这个问题的答案。

我希望有一个单独的索引,但如果 'Response' 是索引也可以,如果这样更容易的话。

我不确定如何使用 pivot_table 执行此操作,但如果有帮助,无需以下内容即可轻松实现:

out = pd.DataFrame()
for col in df.columns:
    out = out.append(df[col].value_counts())

out = out.transpose()

            X    Y    Z
Agree     3.0  2.0  1.0
Disagree  1.0  2.0  1.0
Neutral   2.0  2.0  4.0

如果需要,您还可以根据索引命名 'Response' 列

我们可以使用DataFrame.apply + pd.value_counts:

new_df=df.apply(pd.value_counts)
print(new_df)

          X  Y  Z
Agree     3  2  1
Disagree  1  2  1
Neutral   2  2  4

我们还可以:

df2=df.melt()
new_df=pd.crosstab(df2['value'],df2['variable'])
print(new_df)
variable  X  Y  Z
value            
Agree     3  2  1
Disagree  1  2  1
Neutral   2  2  4