【问题标题】:Pivot output isn't as expected枢轴输出不如预期
【发布时间】:2021-03-07 05:51:27
【问题描述】:

我的数据已经汇总并分组到名为 df 的数据框中:

| id | segment | region   | points |
|----|---------|----------|--------|
| 90 | Gold    | APAC     | 21     |
| 90 | Silver  | EMEA     | 34     |
| 90 | Bronze  | AMERICAS | 564    |
| 90 | Gold    | EMEA     | 3939   |
| 90 | Silver  | Americas | 989    |
| 90 | Gold    | EMEA     | 43     |
| 90 | Silver  | APAC     | 13     |
| 90 | Bronze  | AMERICAS | 567    |

我想将segmentregion 都旋转到列,然后合计这些列的分数。根据上面的输入,输出将如下所示:

| id | Gold | Silver | Bronze | APAC | EMEA | AMERICAS |
|----|------|--------|--------|------|------|----------|
| 90 | 4003 | 1036   | 1131   | 34   | 4016 | 2120     |

到目前为止,我尝试将我的数据框转换为 Pandas,然后使用内置的 pivot_table 函数。

import pandas as pd
df_pd = df.toPandas()
pd.pivot_table(df_pd, values = 'points', index=['id'], columns = ['segment', 'region']).reset_index()

代码有效,但输出不如预期。我没有将每个regionsegment 作为一列,而是得到两行列。在两行列中,region 似乎是segment 的子组。见下文(注意,由于样本数据中使用了随机数,数字不匹配,我更关心形状):

【问题讨论】:

    标签: python-3.x pandas pivot pivot-table transpose


    【解决方案1】:

    使用双 pivot_tableDataFrame.join 的解决方案:

    df1 = pd.pivot_table(df_pd, values='points', index='id', columns='segment', aggfunc='sum')
    df2 = pd.pivot_table(df_pd, values='points', index='id', columns='region', aggfunc='sum')
    
    df = df1.join(df2).reset_index()
    print (df)
       id  Bronze  Gold  Silver  AMERICAS  APAC  Americas  EMEA
    0  90    1131  4003    1036      1131    34       989  4016
    

    在您的解决方案中,可以在MultiIndex in columns 的第一级和第二级添加sumjoin

    df3 = pd.pivot_table(df_pd,
                        values = 'points', 
                        index='id', 
                        columns = ['segment', 'region'], 
                        aggfunc='sum')
    
    df = df3.sum(level=0, axis=1).join(df3.sum(level=1, axis=1)).reset_index()
    print (df)
       id  Bronze  Gold  Silver  AMERICAS  APAC  EMEA  Americas
    0  90    1131  4003    1036      1131    34  4016       989
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-01-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多