在下面的pandas数据框中,我想用" -1"更改每一行。值与前一行的值。所以这是原来的df:
position
0 0
1 -1
2 1
3 1
4 -1
5 0
我想改变它:
position
0 0
1 0
2 1
3 1
4 1
5 0
我是按照以下方式进行的,但我认为应该采用更快的方法,可能会对其进行矢量化或类似的事情(虽然我无法做到)。
for i, row in self.df.iterrows():
if row["position"] == -1:
self.df.loc[i, "position"] = self.df.loc[i-1, "position"]
所以,代码有效,但似乎很慢,有没有办法加快速度呢?
答案 0 :(得分:2)
使用replace
+ ffill
:
df.replace(-1, np.nan).ffill()
position
0 0.0
1 0.0
2 1.0
3 1.0
4 1.0
5 0.0
替换会将-1
转换为NaN
值。 ffill
会将NaN
替换为恰好位于其上方的值。
使用.astype
获得整数结果:
df.replace(-1, np.nan).ffill().astype(int)
position
0 0
1 0
2 1
3 1
4 1
5 0
不要忘记重新分配结果。如果需要,您可以执行非position
的相同操作:
df['position'] = df['position'].replace(-1, np.nan).ffill().astype(int)
使用np.where
的解决方案:
c = df['position']
df['position'] = np.where(c == -1, c.shift(), c)
df
position
0 0.0
1 0.0
2 1.0
3 1.0
4 1.0
5 0.0