Pandas 如何使用groupby和pivot_表使pivto表看起来像Excel';s
我有这个数据帧,我必须把它转换成一个数据透视表。没问题。Pandas提供了pivot/pivot_表,允许创建漂亮的pivot表,但Excel的一些功能我似乎无法复制 哪一个?中间汇总(见Pandas 如何使用groupby和pivot_表使pivto表看起来像Excel';s,pandas,pivot,pivot-table,Pandas,Pivot,Pivot Table,我有这个数据帧,我必须把它转换成一个数据透视表。没问题。Pandas提供了pivot/pivot_表,允许创建漂亮的pivot表,但Excel的一些功能我似乎无法复制 哪一个?中间汇总(见分部_sac_ac中的汇总总和)并通过 slice_ac = df.groupby(by='ac').sum() slice_sac = df.groupby(by='sac').sum() 如何集成3个(枢轴、切片、切片)对象 编辑:部分结果,但仍然不令人满意(部分原因是我可以集成slice\u sac,但
分部_sac_ac
中的汇总总和)并通过
slice_ac = df.groupby(by='ac').sum()
slice_sac = df.groupby(by='sac').sum()
如何集成3个(枢轴、切片、切片)对象
编辑:部分结果,但仍然不令人满意(部分原因是我可以集成slice\u sac
,但不能集成slice\u ac
——一般来说,所有这些都离excel很远):
table_df = pd.pivot_table(df, index=['ac','sac'], values='value', columns=['name'], aggfunc=[np.sum], margins=True)
print(table_df.stack(['name']))
这将产生:
sum
ac sac name
bond Corp omega 0.05
All 0.05
Govt lambda 0.05
rho 0.20
All 0.25
equity Europe alfa 0.05
beta 0.05
gamma 0.10
All 0.20
US epsilon 0.20
All 0.20
All alfa 0.05
beta 0.05
epsilon 0.20
gamma 0.10
lambda 0.05
omega 0.05
rho 0.20
All 0.70
例如:
import pandas as pd
import numpy as np
division_sac_ac = {'equity': ['Europe', 'US'], 'bond': ['Corp', 'Govt']}
df = pd.DataFrame.from_dict({'record_1': ['alfa', 'Europe', 'equity', 0.05],
'record_2': ['beta', 'Europe', 'equity', 0.05],
'record_3': ['gamma', 'Europe', 'equity', 0.1],
'record_4': ['epsilon', 'US', 'equity', 0.2],
'record_5': ['rho', 'Govt', 'bond', 0.2],
'record_6': ['lambda', 'Govt', 'bond', 0.05],
'record_7': ['omega', 'Corp', 'bond', 0.05], }, orient='index')
df.columns = ['name', 'sac', 'ac', 'value']
table_df = pd.pivot_table(df, index=['ac','sac','name'], values='value', aggfunc=[np.sum])
slice_ac = df.groupby(by='ac').sum()
slice_sac = df.groupby(by='sac').sum()
print(table_df)
print(slice_ac)
print(slice_sac)
table_df
完成了这项工作,但我还想集成中间结果(slice_ac,slice_sac
),如图所示:
而我的输出更像:
sum
ac sac name
bond Corp omega 0.05
Govt lambda 0.05
rho 0.20
equity Europe alfa 0.05
beta 0.05
gamma 0.10
US epsilon 0.20
value
ac
bond 0.3
equity 0.4
value
sac
Corp 0.05
Europe 0.20
Govt 0.25
US 0.20
您可以通过使用空值(或类似“小计”的占位符值)作为聚合列的索引值,将
表df
、切片ac
和切片sac
连接起来,例如
slice_ac = table_df.groupby(level=0).sum()
slice_sac = table_df.groupby(level=[0, 1]).sum()
slice_ac.index = pd.MultiIndex.from_tuples([(i, '', '') for i in slice_ac.index])
slice_sac.index = pd.MultiIndex.from_tuples([(i, j, '') for i, j in slice_sac.index])
pd.concat([table_df, slice_ac, slice_sac]).sort()
将输出
sum
ac sac name
bond 0.30
Corp 0.05
omega 0.05
Govt 0.25
lambda 0.05
rho 0.20
equity 0.40
Europe 0.20
alfa 0.05
beta 0.05
gamma 0.10
US 0.20
epsilon 0.20