我在stackoverflow中看了一些解决方案,但还没有找到适合我的东西
我有一个数据框架:
column_1 | column_2 | column_3 | column_4 | ...
1 nan 1 nan
2 3 4 nan
3 nan 5 nan
... ... ... ...
我想移动column_2
为none值的所有行
所以我这样做了:
import math
for index, row in df.iterrows():
if not math.isnan(row["column_2]):
df.iloc[index, :] = df.iloc[index, :].shift()
,它可以工作。这是输出:
column_1 | column_2 | column_3 | column_4 | ...
nan 1 nan 1 # this row changed
2 3 4 nan
nan 3 nan 5 # this row changed
... ... ... ...
问题是它太慢了
是否有一种方法可以更快地实现同样的事情?
仅对已过滤的行使用DataFrame.shift
和axis=1
:
m = df["column_2"].isna()
df[m] = df[m].shift(axis=1)
print (df)
column_1 column_2 column_3 column_4
0 NaN 1.0 NaN 1.0
1 2.0 3.0 4.0 NaN
2 NaN 3.0 NaN 5.0
替代解决方案:
df = df.mask(df["column_2"].isna(), df.shift(axis=1))