Pandas 根据连续重复项创建新列

Pandas creating new column based on consecutive duplicates

我有一个如下所示的 Pandas 数据框,其中 A 列是一系列字符串,B 列中的值是 true/false,具体取决于 A 列的值是否相同作为上一行中 A 列的值。

A    B       
1    False          
1    True             
1b   False          
1b   True                
1b   True    
1    False    

我想添加一个新列 C,它为所有 连续的重复项 分配相同的值(可以是任何值),但是这个值必须是唯一的分配给其他连续重复条目组的值。例如:

A    B        C
1    False    1       
1    True     1         
1b   False    2         
1b   True     2            
1b   True     2
1    False    3

关于如何有效地解决这个问题有什么想法吗?

尝试 groupby ngroup + 1 一定要 sort=False 以确保组是按照它们在 DataFrame 中出现的顺序创建的:

df['C'] = df.groupby(['A', (~df['B']).cumsum()], sort=False).ngroup() + 1
    A      B  C
0   1  False  1
1   1   True  1
2  1b  False  2
3  1b   True  2
4  1b   True  2
5   1  False  3

或者假设值按 cumsum 的排序顺序出现,可以直接使用以下任一方法:

df['C'] = (~df['B']).cumsum()
    A      B  C
0   1  False  1
1   1   True  1
2  1b  False  2
3  1b   True  2
4  1b   True  2
5   1  False  3

这相当于:

df['A'].ne(df['A'].shift()).cumsum()
0    1
1    1
2    2
3    2
4    2
5    3
Name: A, dtype: int32

如果尚未计算 B 列,这将是解决此问题的标准方法。

尝试与 shift 结合 cumsum

df['C'] = df.A.ne(df.A.shift()).cumsum()
Out[191]: 
0    1
1    1
2    2
3    2
4    2
5    3
Name: A, dtype: int64

我想这就是你要找的。

df['C'] = df.groupby('A').ngroup() + 1