Python:替换while循环以使用移位值更新数据框的行

时间:2019-10-16 21:12:55

标签: python-3.x dataframe

我有一个数据框df:

索引分支标志序列
1 X 0 A
2 X 1 B
3 X 1 C
4 X 1 D
5 X 0 E
6 X 1 F
7 X 0 G
8 X 0 H
9 Y 0 I
10 Y 1 J
11 Y 1 K

我需要更新Sequence列,如下所示: 对于每个分支,所有标志等于1的序列的值应与位于上面的标志等于0的行的序列(上面的标志等于0的第一行)具有相同的值。我已经使用下面的While循环成功做到了这一点,但是由于我的数据框有大约2M的行,因此我想找到一种“ Pythonic”的方法来更有效地做到这一点。

我已经用While循环解决了这个问题,但想找到一种Python方法来提高效率(使用while循环,对于1.7M行,大约需要250秒)。

While np.logical_and(df['Flag']==1,df['Sequence'] != df['Sequence'].shift(1)).any()):
  df['Sequence']=np.where(df['Flag']==1,df['Sequence'] != df['Sequence'].shift(1),df['Sequence'].shift(1),df['Sequence'])

df dataframe

Index   Branch  Flag   Sequence
1         X      0        A    
2         X      1        B  
3         X      1        C  
4         X      1        D  
5         X      0        E  
6         X      1        F  
7         X      0        G  
8         X      0        H  
9         Y      0        I  
10        Y      1        J  
11        Y      1        K 


Output:

Index   Branch  Flag   Sequence
1         X      0        A    
2         X      1        A  
3         X      1        A  
4         X      1        A  
5         X      0        E  
6         X      1        E  
7         X      0        G  
8         X      0        H  
9         Y      0        I  
10        Y      1        I  
11        Y      1        I

1 个答案:

答案 0 :(得分:1)

我之前发布的解决方案确实不正确。

尝试一下:

df.Sequence[df.Flag == 1] = np.nan
df.Sequence.ffill(inplace=True)

结果:

╔═══════╦════════╦══════╦══════════╗
║ Index ║ Branch ║ Flag ║ Sequence ║
╠═══════╬════════╬══════╬══════════╣
║     1 ║ X      ║    0 ║ A        ║
║     2 ║ X      ║    1 ║ A        ║
║     3 ║ X      ║    1 ║ A        ║
║     4 ║ X      ║    1 ║ A        ║
║     5 ║ X      ║    0 ║ E        ║
║     6 ║ X      ║    1 ║ E        ║
║     7 ║ X      ║    0 ║ G        ║
║     8 ║ X      ║    0 ║ H        ║
║     9 ║ Y      ║    0 ║ I        ║
║    10 ║ Y      ║    1 ║ I        ║
║    11 ║ Y      ║    1 ║ I        ║
╚═══════╩════════╩══════╩══════════╝