Как создать таблицу частот из кадра данных? - PullRequest
0 голосов
/ 02 ноября 2018

У меня есть df с необработанными данными опроса, похожими на приведенные ниже, с 12000 строками и сорока вопросами. Все ответы категорически

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']})

Я хочу классифицировать ответы на каждый вопрос в соответствии с возрастом, полом и доходом, чтобы получить таблицу частот (в%) для каждого вопроса, который выглядит следующим образом: снимок экрана с вопросами .

enter image description here

Кросс-таблица производит слишком много категорий, то есть она разбита по доходам и по доходам, по возрасту и т. Д. Поэтому я не уверен, как лучше это сделать. Я уверен, что это простая проблема, но я новичок в Python, любая помощь будет оценена

Ответы [ 2 ]

0 голосов
/ 02 ноября 2018

Вы можете сделать 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
0 голосов
/ 02 ноября 2018

Как вы сказали, использование кросс-таблицы для всех столбцов разбивает результат по каждому столбцу. Вы можете использовать отдельные кросс-таблицы, а затем 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...