我发现很多类似的问题都得到了回答,但它们不能用于 groupby,或者它们不是在寻找连续的布尔值。
我正在寻找一种方法(非循环)来计算一组上连续过去的 TRUE 值的数量。
data = [
[False, 'CLE',],
[True, 'CLE'],
[True, 'CLE'],
[False, 'MON'],
[False, 'MON'],
[True, 'MON'],
[True, 'CLE'],
[False, 'CLE'],
[False, 'CLE']
]
# Create the pandas DataFrame
df = pd.DataFrame(data,
columns=["a", "city"])
期望的输出:
0
1
2
0
0
1
3
0
0
我一直在尝试:
df['x']=df.a.groupby((df.city!=df.city.shift()).apply(lambda x: x==True).cumsum()).cumcount()
答案 0 :(得分:3)
为了识别连续的 True
块,我们可以在 cumsum
上使用 False
。然后我们可以对这些块进行分组:
blocks = (~df['a']).groupby(df['city']).cumsum()
output = df.groupby([blocks, 'city'])['a'].cumsum()
输出:
0 0
1 1
2 2
3 0
4 0
5 1
6 3
7 0
8 0
Name: a, dtype: int64