我有一个简单的数据框,其中包含我需要在大陆上分组的索引:
country continent value1 value2 value3
uk eu 1 9 2
us na 8 39 0
spain eu 3 9 0
mexico na 2 7 8
japan asia 9 9 2
china asia 2 8 6
我要做的就是创建一个为大洲创建行的数据框,并将其小计作为值合并,然后在末尾添加Grand total并合并每列的总计。
Row Labels Sum of value1 Sum of value2 Sum of value3
asia 11 17 8
china 2 8 6
japan 9 9 2
eu 4 18 2
spain 3 9 0
uk 1 9 2
na 10 46 8
mexico 2 7 8
us 8 39 0
Grand Total 25 81 18
这是我的代码,由于某些原因,我只能使用aggfunc获得总计,而不是小计。
pd.pivot_table(mergedcpt, index=['continent','spread_Bucket'],aggfunc=np.sum, margins=True)
eu uk 1 9 2
us 8 39 0
na spain 3 9 0
mexico 2 7 8
asia japan 9 9 2
china 2 8 6
all 25 81 18
我错了什么?感谢帮助 - 我知道以前的熊猫版本包含了你可以聚合的行,但我不知道如何在新版本中执行此操作。感谢帮助。
答案 0 :(得分:1)
对于你想要做的事情,没有快速的单行代码。您可以通过在大洲上进行分组来创建新数据框,附加原始数据框,然后对值进行排序以获得所需的顺序。
import pandas as pd
df = pd.DataFrame(
{'continent': ['eu', 'na', 'eu', 'na', 'asia', 'asia'],
'country': ['uk', 'us', 'spain', 'mexico', 'japan', 'china'],
'value1': [1, 8, 3, 2, 9, 2],
'value2': [9, 39, 9, 7, 9, 8],
'value3': [2, 0, 0, 8, 2, 6]})
g = df.groupby(['continent','continent']).sum()
g.index.set_names('Row Label', level=-1, inplace=True)
gt = pd.DataFrame([g.sum()], columns=g.columns,
index=pd.MultiIndex.from_tuples([('~','Grand Total')]))
df2 = g.append(gt).reset_index()
out = ( df2.append(df.rename(columns={'country': 'Row Label'})
.sort_values(['continent', 'Row Label']))
.sort_values('continent')
.drop('continent', axis=1)
.rename(columns={'value1': 'Sum of value1',
'value2': 'Sum of value2',
'value3': 'Sum of value3'})
.reset_index(drop=True) )
out
# returns:
Row Label Sum of value1 Sum of value2 Sum of value3
0 asia 11 17 8
1 china 2 8 6
2 japan 9 9 2
3 eu 4 18 2
4 spain 3 9 0
5 uk 1 9 2
6 na 10 46 8
7 mexico 2 7 8
8 us 8 39 0
9 Grand Total 25 81 18