我想将按日历年排序的数据框更改为过去的年份。
id 2015 2016 2017 2018 2019
0 NaN 7.0 8.0 7.0 3.0
1 NaN 8.0 5.0 7.0 NaN
2 4.0 NaN 5.0 NaN NaN
3 5.0 4.0 3.0 9.0 NaN
4 NaN NaN NaN NaN 1.0
5 4.0 3.0 NaN 4.0 5.0
我需要将所有有效值移到第一列。
预期的结果应该是这样的:
id Y1 Y2 Y3 Y4 Y5
0 7.0 8.0 7.0 3.0 NaN
1 8.0 5.0 7.0 NaN NaN
2 4.0 NaN 5.0 NaN NaN
3 5.0 4.0 3.0 9.0 NaN
4 1.0 NaN NaN NaN NaN
5 4.0 3.0 NaN 4.0 5.0
注意:“id”是列,不是索引。
请您参考如下方法:
让我们尝试按行应用 np.roll:
df = df.set_index('id')
# using @user3483203's argmax trick to optimize
df.apply(lambda x: np.roll(x, -(~np.isnan(x)).argmax()), axis=1, raw=True)
2015 2016 2017 2018 2019
id
0 7.0 8.0 7.0 3.0 NaN
1 8.0 5.0 7.0 NaN NaN
2 4.0 NaN 5.0 NaN NaN
3 5.0 4.0 3.0 9.0 NaN
4 1.0 NaN NaN NaN NaN
5 4.0 3.0 NaN 4.0 5.0
不幸的是,np.roll 没有矢量化以对不同的行执行不同的移位,并且为了在值之间保留 NaN,必须这样做。
