Создайте отдельную кросс-таблицу в pandas DataFrame для каждой категории в столбце - PullRequest
1 голос
/ 16 марта 2020

У меня есть pandas DataFrame df, который выглядит следующим образом (пример):

df = pd.DataFrame({'Time' : ['Low','High','Medium','Low','Low','High','Low','High','Medium'],
                   'Sentiment' : ['Pos','Neg','Neg','Pos','Pos','Neg','Neg','Pos','Neg'],
                   'Product' : ['P1','P1','P1','P2','P1','P2','P2','P2','P1']})

У меня простой вопрос (который я искал до публикации), мне нужно создать crosstab который может быть легко создан с помощью этой команды:

pd.crosstab(df['Time'],df['Sentiment'])

И дает желаемый результат:

Sentiment  Neg  Pos
Time               
High         2    1
Low          1    3
Medium       2    0

Теперь в данных есть еще один столбец с именем Product, который имеет около 50 уникальных категорий (для примера я включил 2), и мне нужно создать похожие crosstab объекты для всех категорий, как я могу это сделать?

Мой ожидаемый результат показан ниже:

Crosstab для Product1 (P1):

P1

Sentiment  Neg  Pos
Time
High         1    0
Low          0    2
Medium       2    0

Crosstab для Product1 (P2):

P2

Sentiment  Neg  Pos
Time
High         1    1
Low          1    1
Medium       0    0

Как я могу получить 50 crosstab в одном go?

1 Ответ

2 голосов
/ 16 марта 2020

Используйте crosstab со списком обоих столбцов - так получите MultiIndex:

df1 = pd.crosstab([df['Product'], df['Time']],df['Sentiment'])
print (df1)
Sentiment       Neg  Pos
Product Time            
P1      High      1    0
        Low       0    2
        Medium    2    0
P2      High      1    1
        Low       1    1

Для добавления всех возможных значений в MultiIndex add DataFrame.unstack и DataFrame.stack:

df1 = pd.crosstab([df['Product'], df['Time']],df['Sentiment']).unstack(fill_value=0).stack()
print (df1)
Sentiment       Neg  Pos
Product Time            
P1      High      1    0
        Low       0    2
        Medium    2    0
P2      High      1    1
        Low       1    1
        Medium    0    0

А затем выберите по первому уровню DataFrame.loc:

print (df1.loc['P1'])
Sentiment  Neg  Pos
Time               
High         1    0
Low          0    2
Medium       2    0 


print (df1.loc['P2'])
Sentiment  Neg  Pos
Time               
High         1    1
Low          1    1
...