Python 3.x Python:替换while循环以使用shift值更新数据帧的行

Python 3.x Python:替换while循环以使用shift值更新数据帧的行,python-3.x,dataframe,Python 3.x,Dataframe,我有一个数据帧df: 索引分支标志序列 1 X 0 A 2 X 1 B 3x1c 4x1d 5x0e 6x1f 7 X 0克 8 X 0小时 9Y0I 10 Y 1 J 11 Y 1 K 我需要更新序列列,如下所示: 对于每个分支,具有等于1的标志的所有序列的值应与位于上方的具有等于0的标志的行(具有等于0的标志的第一行)的序列的值相同。我已经使用下面的While循环实现了这一点,但是由于我的数据帧有大约2百万行,我想找到一种“Pythonic”方法来更有效地实现这一点 我已经用While循环解

我有一个数据帧df:

索引分支标志序列
1 X 0 A
2 X 1 B
3x1c
4x1d
5x0e
6x1f
7 X 0克
8 X 0小时
9Y0I
10 Y 1 J
11 Y 1 K

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

我已经用While循环解决了这个问题,但是我想找到一种类似python的方法来提高效率(对于使用While循环的170万行,大约250秒)

而np.logical_和(df['Flag']==1,df['Sequence'!=df['Sequence'].shift(1)).any():
df['Sequence']=np.其中(df['Flag']==1,df['Sequence'!=df['Sequence'].shift(1),df['Sequence'].shift(1),df['Sequence']))
数据帧
索引分支标志序列
1 X 0 A
2x1b
3x1c
4x1d
5 X 0 E
6x1f
7 X 0克
8 X 0小时
9Y0I
10 Y 1 J
11 Y 1 K
输出:
索引分支标志序列
1 X 0 A
2 X 1 A
3 X 1 A
4 X 1 A
5 X 0 E
6x1e
7 X 0克
8 X 0小时
9Y0I
10 Y 1 I
11 Y 1 I

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

试试这个:

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        ║
╚═══════╩════════╩══════╩══════════╝

嗨,谢谢。我已经测试了您的解决方案,但不幸的是,它只更新了1个A/E/I,与上面结果中描述的不一样,只更新了1条指令。你的意思是你的解决方案是使用“掩码”解决方案而不是使用np.where吗?@Jon1谢谢你指出这一点。我在空闲时测试它,我可能多次运行该语句,这就是为什么它对我有效。我已经修改了解决方案。看看它是否能给你预期的结果。注意:我在这里没有考虑组(基于
分支
列)。所以,如果这会引起任何问题,请告诉我。非常感谢。我已经测试过了,对我来说似乎还可以。我应该将它与我的数据集一起使用,并让您随时了解最新情况。然后,我当然会验证您非常pythonic的解决方案。当你拥有它时,它看起来很简单:-)辉煌的解决方案,据我所知,这是一个真正的pythonic解决方案:简单而有效!为我的180万行节省215秒。有些人会发现这一点很明显,但需要用Python的方法来找到它。再次感谢。@Jon1欢迎:)。。不过,请注意我对小组的看法。这个解决方案不考虑它。这对您有效,因为在每个组的开头,标志中都有一个
0
。这可能就是数据的结构。但是,如果分支行
Y
Flag
列中没有任何
0
s,则前面组的最后一个序列值将在此处填充。我只是想指出这一点。很高兴它帮助了你。