Python 如何从数据帧生成频率表?

Python 如何从数据帧生成频率表?,python,pandas,dataframe,Python,Pandas,Dataframe,我有一个带有原始调查数据的df,类似于下面的12000行和40个问题。所有的回答都是直截了当的 import pandas as pd df = pd.DataFrame({'Age' : ['20-30','20-30','30-45', '20-30','30-45','20-30'], 'Gender' : ['M', 'F', 'F','F','M','F'], 'Income' : ['20-30k', '3

我有一个带有原始调查数据的df,类似于下面的12000行和40个问题。所有的回答都是直截了当的

import pandas as pd

df = pd.DataFrame({'Age' : ['20-30','20-30','30-45', '20-30','30-45','20-30'],
                   'Gender' : ['M', 'F', 'F','F','M','F'],
                   'Income' : ['20-30k', '30-40k', '40k+', '40k+', '40k+', '20-30k'],
                   'Question1' : ['Good','Bad','OK','OK','Bad','Bad'],
                   'Question2' : ['Happy','Unhappy','Very_Unhappy','Very_Unhappy','Very_Unhappy','Happy']})
我想根据年龄、性别和收入对每个问题的回答进行分类,为每个问题生成一个频率(按%)表,如下所示


Crosstab产生了太多的分类(按收入、收入范围、年龄等分类),所以我不确定如何最好地进行这项工作。我相信这是一个简单的问题,但我对python还不熟悉,如您所说,如果您能提供任何帮助,我将不胜感激。

,对所有列使用交叉表将结果按每列进行分解。您可以使用单个交叉选项卡,然后使用concat

pd.concat([pd.crosstab(df.Question1, df.Gender), pd.crosstab(df.Question1, df.Income), pd.crosstab(df.Question1, df.Age)], axis = 1)

            F   M   20-30k  30-40k  40k+    20-30   30-45
Question1                           
Bad         2   1   1       1       1       2       1
Good        0   1   1       0       0       1       0
OK          2   0   0       0       2       1       1
编辑:在列中获取附加级别

age = pd.crosstab(df.Question1, df.Age)
age.columns = pd.MultiIndex.from_product([['Age'], age.columns])
gender = pd.crosstab(df.Question1, df.Gender)
gender.columns = pd.MultiIndex.from_product([['Gender'], gender.columns])
income = pd.crosstab(df.Question1, df.Income)
income.columns = pd.MultiIndex.from_product([['Income'], income.columns])
pd.concat([age, gender, income], axis = 1)


        Age             Gender  Income
        20-30   30-45   F   M   20-30k  30-40k  40k+
Question1                           
Bad     2       1       2   1   1       1       1
Good    1       0       0   1   1       0       0
OK      1       1       2   0   0       0       2

您可以在
交叉表

s=df.drop('Question2',1).\
     melt(['Age','Gender','Income']).drop('variable',1).\
        rename(columns={'value':'v1'}).melt('v1')

pd.crosstab(s.v1,[s.variable,s.value])
Out[235]: 
variable   Age       Gender    Income            
value    20-30 30-45      F  M 20-30k 30-40k 40k+
v1                                               
Bad          2     1      2  1      1      1    1
Good         1     0      0  1      1      0    0
OK           1     1      2  0      0      0    2

完美的多谢各位much@zepaft只是提醒一下,如果它解决了你的问题,别忘了把它标记为“答案”。找到一种新方法:-)