使用前一行值对pandas行进行条件更改

时间:2017-11-01 11:23:13

标签: python pandas dataframe

在下面的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"]

所以,代码有效,但似乎很慢,有没有办法加快速度呢?

1 个答案:

答案 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