Python 如何从数据帧生成频率表?
我有一个带有原始调查数据的df,类似于下面的12000行和40个问题。所有的回答都是直截了当的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
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只是提醒一下,如果它解决了你的问题,别忘了把它标记为“答案”。找到一种新方法:-)