Python将行汇总成列(Pandas pivot table)

2024-10-01 15:33:13 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一份按公司分类的人员名单

Company_code Person Date    Earning1 Earning2
1            Jonh   2014-01 100      200
2            Jonh   2014-01 300      400
1            Jonh   2014-02 500      600
1            Peter  2014-01 300      400
1            Peter  2014-02 500      600

我想总结一下:

^{pr2}$

我在使用SQL时遇到了同样的问题,我用代码解决了这个问题:

with t(Company_code, Person, Dt, Earning1, Earning2) as (
  select 1, 'Jonh', to_date('2014-01-01', 'YYYY-MM-DD'), 100, 200 from dual union all
  select 2, 'Jonh', to_date('2014-01-01', 'YYYY-MM-DD'), 300, 400 from dual union all
  select 1, 'Jonh', to_date('2014-02-01', 'YYYY-MM-DD'), 500, 600 from dual union all
  select 1, 'Peter', to_date('2014-01-01', 'YYYY-MM-DD'), 300, 400 from dual union all
  select 1, 'Peter', to_date('2014-02-01', 'YYYY-MM-DD'), 500, 600 from dual
)
select * 
  from t
 pivot ( 
     sum(Earning1) e1
   , sum(Earning2) e2 
 for dt in (
     to_date('2014-01-01', 'YYYY-MM-DD') "2014-01"
   , to_date('2014-02-01', 'YYYY-MM-DD') "2014-02"
 )
)

COMPANY_CODE    PERSON  2014-01_E1  2014-01_E2  2014-02_E1  2014-02_E2
----------------------------------------------------------------------
           2    Jonh           300         400           -           -
           1    Peter          300         400         500         600
           1    Jonh           100         200         500         600

如何在python中实现这一点?我试着用熊猫透视表:

pd.pivot_table(df, columns=['COMPANY_CODE', 'PERSON', 'DATE'], aggfunc=np.sum)

但这只是换了一张桌子。。。有什么线索吗?在


Tags: tofromdateallselectddpetermm
2条回答

这里是最好的方法,使用^{}。在

df = pd.DataFrame({
    'company_code': [1, 2, 1, 1, 1],
    'person': ['Jonh', 'Jonh', 'Jonh', 'Peter', 'Peter'],
    'earning2': [200, 400, 600, 400, 600],
    'earning1': [100, 300, 500, 300, 500],
    'date': ['2014-01', '2014-01', '2014-02', '2014-01', '2014-02']
})

df = df.set_index(['date', 'company_code', 'person'])
df.unstack('date')

导致:

^{pr2}$

无论如何,将索引设置为['date', 'company_code', 'person']是个好主意,因为这正是您的数据框架所包含的:两个不同的收益类别(1和2),每个类别都由日期、公司代码和人员描述。在

一个很好的实践是始终弄清楚数据帧中的“真实”数据是什么,哪些列是元数据,并相应地编制索引。在

使用用户1827356的建议:

df2 = pd.pivot_table(df, rows=['Company_code', 'Person'], cols=['Date'], aggfunc='sum')
print(df2)
#                      Earning1           Earning2         
# Date                  2014-01  2014-02   2014-01  2014-02
# Company_code Person                                      
# 1            Jonh         100      500       200      600
#              Peter        300      500       400      600
# 2            Jonh         300      NaN       400      NaN

您可以这样展开分层列:

^{pr2}$

相关问题 更多 >

    热门问题