我有一个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']})
我想根据年龄,性别和收入对每个问题的回答进行分类,以为每个看起来像screenshot showing questions的问题生成频率(按百分比)表。
Crosstab产生太多类别,即按收入,收入内,年龄等细分。因此我不确定如何最好地做到这一点。我敢肯定这是一个简单的问题,但是我对python还是陌生的,将不胜感激
答案 0 :(得分:1)
正如您所说,对所有列使用交叉表可以按列细分结果。您可以使用单个交叉标签,然后进行合并
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
答案 1 :(得分:1)
您可以在melt
之前完成crosstab
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