枢轴输出不符合预期

Pivot output isn't as expected

我有数据已经​​汇总并分组在名为 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 的子组。见下文(注意,由于样本数据中使用了随机数,数字不匹配,我更关心形状):

pivot_table and DataFrame.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