我有一个如下所示的数据框:
df = pd.DataFrame({'a':[True]*5+[False]*5+[True]*5,'b':[False]+[True]*3+[False]+[True]*5+[False]*4+[True]})
a b
0 True False
1 True True
2 True True
3 True True
4 True False
5 False True
6 False True
7 False True
8 False True
9 False True
10 True False
11 True False
12 True False
13 True False
14 True False
仅当列
a
的同一行上的内部值为 True
时,如何才能选择列 b
为 True
的块?
我知道我可以将 DataFrame 分成连续的
True
区域,并对每个 DataFrame 块应用一个函数,但这是针对 1000 万行以上的更大问题,我认为这样的解决方案不会扩展得很好。
我的预期输出如下:
a b c
0 True False True
1 True True True
2 True True True
3 True True True
4 True False True
5 False True False
6 False True False
7 False True False
8 False True False
9 False True False
10 True False False
11 True False False
12 True False False
13 True False False
14 True True False
您可以对 a 值进行 groupby,然后查看函数中的 b 值,如下所示:
groupby_consec_a = df.groupby(df.a.diff().ne(0).cumsum())
all_interior = lambda x: x.iloc[1:-1].all()
df['c'] = df.a & groupby_consec_a.b.transform(all_interior)
尝试一下它对您的数据是否足够快。如果没有,则 lambda 必须替换为 pandas 函数,但这会需要更多代码。