Python 对组中的第一个连续匹配项进行计数

Python 对组中的第一个连续匹配项进行计数,python,pandas,numpy,Python,Pandas,Numpy,我对熊猫很陌生,我正在尝试计算这个数据帧中第一个连续的颜色实例的总数 car color 0 audi black 1 audi black 2 audi blue 3 audi black 4 bmw blue 5 bmw green 6 bmw blue 7 bmw blue 8 fiat green 9 fiat green 10 fiat green 11 fiat blue 由于我有它,

我对熊猫很陌生,我正在尝试计算这个数据帧中第一个连续的颜色实例的总数

    car   color
0   audi  black
1   audi  black
2   audi   blue
3   audi  black
4    bmw   blue
5    bmw  green
6    bmw   blue
7    bmw   blue
8   fiat  green
9   fiat  green
10  fiat  green
11  fiat   blue
由于我有它,所以它可以计算第一种颜色出现的累计次数:

它在计算总数时效果很好

    car  colour_cars
0  audi            3
1   bmw            3
2  fiat            3
但事实证明我真正需要的是数一数第一个连续的和,所以应该是这样的

    car  colour_cars
0  audi            2
1   bmw            1
2  fiat            3


我曾尝试使用应用函数来停止序列.sum。如果.eq遇到False,如果能在.eq返回False后找到打破计数的方法,我将不胜感激。

这里有一个稍微不同的方法:

根据车辆或颜色是否从一行更改到下一行来获取组ID df=df.assigngroup_id=df.shift1!=df.anyaxis=1.cumsum 分组并获取连续相同对的len df=df.joindf.groupby'group\u id'。applylen.重命名'concer\u len',on='group\u id' 为每辆车选择第一个长度 df1.按“车”分组。先奉献 df1 返回 汽车 奥迪2 宝马1 菲亚特3 姓名:Conce_len,数据类型:int64 你可以做:

# group by car and consecutive group of colors (compute count)
counts = df.groupby(['car', df.color.ne(df.color.shift()).cumsum()], as_index=False).count()

# fetch only the count corresponding to the first consecutive group of colors
result = counts[~counts.car.duplicated()].rename(columns={'color' : 'colour_cars'})

print(result)
输出

使用:

详情:

为测试颜色列的连续值创建辅助连续系列,传递到,删除从辅助函数中创建的第一级,通过第二次重置将索引转换为列,最后通过以下方式获取每辆车的第一行:

# group by car and consecutive group of colors (compute count)
counts = df.groupby(['car', df.color.ne(df.color.shift()).cumsum()], as_index=False).count()

# fetch only the count corresponding to the first consecutive group of colors
result = counts[~counts.car.duplicated()].rename(columns={'color' : 'colour_cars'})

print(result)
    car  colour_cars
0  audi            2
3   bmw            1
6  fiat            3
df = (df.groupby(['car', df.color.ne(df.color.shift()).cumsum()])
        .size()
        .reset_index(level=1, drop=True)
        .reset_index(name='colour_cars')
        .drop_duplicates('car'))

print (df)
    car  colour_cars
0  audi            2
3   bmw            1
6  fiat            3
print (df.color.ne(df.color.shift()).cumsum())
0     1
1     1
2     2
3     3
4     4
5     5
6     6
7     6
8     7
9     7
10    7
11    8
Name: color, dtype: int32