这是我的数据框:
df = pd.DataFrame(
{
'a': [0, 0, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 1, 1, 0],
'b': [1, -1, -1, -1, 1, -1, 1, 1, -1, 1, 1, -1, 1, 1, -1, 1, 1]
}
)
这就是我想要的输出。我想创建专栏c
:
a b c
0 0 1 0
1 0 -1 0
2 1 -1 0
3 1 -1 0
4 1 1 1
5 1 -1 1
6 0 1 0
7 0 1 0
8 0 -1 0
9 1 1 1
10 1 1 1
11 1 -1 1
12 0 1 0
13 0 1 0
14 1 -1 0
15 1 -1 1
16 0 1 0
这基本上是这篇文章的扩展。下面突出显示的行总结了需要完成此操作的方式。
首先,在column中a
,组是由连续1秒和连续结束后的一行创建的。列中突出显示的行a
是这些组。这一步的解决方案在这里。
现在我需要的是检查b
中每个组的列a
。找到每个组中第一个为 1 的值b
。然后在此之前的任何值都变为 0。这就是c
创建列的方式。
例如,对于 中的第一组a
,列为 1 的第一个值b
是行号4
。该组中先前的值变为 0。结果是 列 中第一个突出显示的组c
。
注意,如果对于一个组, 中的所有值b
都不为 1,则对应的组 中c
将变为全 0。
这是我尝试过的方法,但找不到完整的解决方案:
g = df.loc[::-1, 'a'].eq(0).cumsum()
x = df.groupby(g).filter(lambda x: x.b.iloc[0] == 1)
groupby.cummax
使用ondf['b'].eq(1)
和从石斑鱼派生的中间掩码的链接答案的变体:输出和中间体:
通过创建掩码并使用, 进行
GroupBy.cummax
链式设置,将布尔值设置为整数:Series.duplicated
0,1