我有一个数据框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
答案 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 ║
╚═══════╩════════╩══════╩══════════╝