Skip to main content
 首页 » 编程设计

python之你如何将第一个有效值向左移动

2025年05月04日7bhlsheji

我想将按日历年排序的数据框更改为过去的年份。

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,必须这样做。