Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Pandas 如何使用groupby和pivot_表使pivto表看起来像Excel';s_Pandas_Pivot_Pivot Table - Fatal编程技术网

Pandas 如何使用groupby和pivot_表使pivto表看起来像Excel';s

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,但

我有这个数据帧,我必须把它转换成一个数据透视表。没问题。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
,但不能集成
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