为了账号安全,请及时绑定邮箱和手机立即绑定

Dataframe shift 将数据移动到随机列中?

Dataframe shift 将数据移动到随机列中?

幕布斯6054654 2021-12-09 14:36:33
我正在使用代码来移动看起来有点类似于此的时间序列数据:Year    Player          PTSN    AVGN                               2018    Aaron Donald    280.60  17.538  2018    J.J. Watt       259.80  16.238  2018    Danielle Hunter 237.60  14.850  2017    Aaron Donald    181.0   12.929  2016    Danielle Hunter 204.6   12.788目的是让它变成这样:                        AVGN   PTSN  AVGN_prev  PTSN_prevPlayer          Year                                     Aaron Donald    2016     NaN    NaN        NaN        NaN                2017  12.929  181.0        NaN        NaN                2018  17.538  280.6     12.929      181.0Danielle Hunter 2016  12.788  204.6        NaN        NaN                2017   8.325  133.2     12.788      204.6                2018  14.850  237.6      8.325      133.2J.J. Watt       2016     NaN    NaN        NaN        NaN                2017     NaN    NaN        NaN        NaN                2018  16.238  259.8        NaN        NaN我正在使用此代码来实现这一目标:res = df.set_index(['player', 'Year'])idx = pd.MultiIndex.from_product([df['player'].unique(),                                   df['Year'].unique()],                                names=['Player', 'Year'])res = res.groupby(['player', 'Year']).apply(sum)res = res.reindex(idx).sort_index()res[columns] = res.groupby('Player')[list(res.columns)].shift(1)添加 groupby.sum() 因为数据框中的一些球员在同一赛季从一支球队转移到另一支球队,我想合并这些数字。但是,我拥有的数据实际上非常错误。数据有太多列要发布,但似乎是将前一年 (_prev) 的数据放入随机列中。它不会改变,并且总是将它放在相同的错误列中。这是由 groupby.sum() 引起的问题吗?是不是因为我使用了一个列变量(包含与 res.columns 相同的名称,并附加了一个 str(_prev))和一个列表(res.columns)?不管是哪一种,我该如何解决这个问题?
查看完整描述

1 回答

?
慕标琳琳

TA贡献1830条经验 获得超9个赞

我建议使用:


#first aggregate for unique MultiIndex 

res = df.groupby(['Player', 'Year']).sum()


#MultiIndex

idx = pd.MultiIndex.from_product(res.index.levels,

                                names=['Player', 'Year'])

#aded new missing years 

res = res.reindex(idx).sort_index()


#shift all columns, add suffix and join to original

res = res.join(res.groupby('Player').shift().add_suffix('_prev'))

print (res)

                       PTSN    AVGN  PTSN_prev  AVGN_prev

Player          Year                                     

Aaron Donald    2016    NaN     NaN        NaN        NaN

                2017  181.0  12.929        NaN        NaN

                2018  280.6  17.538      181.0     12.929

Danielle Hunter 2016  204.6  12.788        NaN        NaN

                2017    NaN     NaN      204.6     12.788

                2018  237.6  14.850        NaN        NaN

J.J. Watt       2016    NaN     NaN        NaN        NaN

                2017    NaN     NaN        NaN        NaN

                2018  259.8  16.238        NaN        NaN


查看完整回答
反对 回复 2021-12-09
  • 1 回答
  • 0 关注
  • 148 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信