在 pandas DataFrame 中为列中的每个类别创建单独的交叉表

Create separate crosstab in pandas DataFrame for each category in a column

我有一个 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 产品 1 (P2):

P2

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

如何一次性获得50个crosstab

对两列的列表使用 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 中添加所有可能的值,请添加 DataFrame.unstack and 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

然后 select 第一级 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