【问题标题】:Create separate crosstab in pandas DataFrame for each category in a column在 pandas DataFrame 中为列中的每个类别创建单独的交叉表
【发布时间】:2020-03-16 12:09:07
【问题描述】:

我有一个 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?

【问题讨论】:

    标签: python pandas pivot-table crosstab


    【解决方案1】:

    使用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 和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
    

    【讨论】:

    • 很好的答案@jezrael 谢谢!!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-08
    • 2021-06-20
    • 1970-01-01
    • 2018-03-20
    • 1970-01-01
    • 2015-03-09
    相关资源
    最近更新 更多