枢轴输出不符合预期
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 |
我想将 segment
和 region
都转换为列,然后计算这些列的总分。根据上面的输入,输出如下所示:
| 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()
代码有效,但输出不符合预期。我没有得到每个 region
和 segment
作为列的总计,而是得到两行列。在两行列中,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
的第一层和第二层添加 sum
和 join
:
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
我有数据已经汇总并分组在名为 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 |
我想将 segment
和 region
都转换为列,然后计算这些列的总分。根据上面的输入,输出如下所示:
| 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()
代码有效,但输出不符合预期。我没有得到每个 region
和 segment
作为列的总计,而是得到两行列。在两行列中,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
的第一层和第二层添加 sum
和 join
:
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