pandas 如何识别一列连续编号且另一列数值相同的列?

5ssjco0h  于 2023-01-07  发布在  其他
关注(0)|答案(2)|浏览(154)

我有一个包含两列AB的数据框。
我想创建一个名为C的新列,以标识具有相同B值的连续A
这里有一个例子

import pandas as pd

df = pd.DataFrame({'A':[1,2,3,5,6,10,11,12,13,18], 'B':[1,1,2,2,3,3,3,3,4,4]})

我找到了一个类似的question,但是这个方法只识别连续的A,而不考虑B

df['C'] = df['A'].diff().ne(1).cumsum().sub(1)

我尝试过groupby B并像这样应用函数:

df['C'] = df.groupby('B').apply(lambda x: x['A'].diff().ne(1).cumsum().sub(1))

但是,它不起作用:TypeError:插入列的索引与框架索引不兼容。
预期的输出为

A   B   C
1   1   0
2   1   0
3   2   1
5   2   2
6   3   3
10  3   4
11  3   4
12  3   4
13  4   5
18  4   6
ogq8wdun

ogq8wdun1#

我们先使用groupbydiffcumsum创建一个顺序计数器,然后使用factorize对计数器进行重新编码

df['C'] = df.groupby('B')['A'].diff().ne(1).cumsum().factorize()[0]

结果

A  B  C
0   1  1  0
1   2  1  0
2   3  2  1
3   5  2  2
4   6  3  3
5  10  3  4
6  11  3  4
7  12  3  4
8  13  4  5
9  18  4  6
mjqavswn

mjqavswn2#

使用DataFrameGroupBy.diff,比较不等于1Series.cumsum,最后减去1

df['C'] = df.groupby('B')['A'].diff().ne(1).cumsum().sub(1)
print (df)
    A  B  C
0   1  1  0
1   2  1  0
2   3  2  1
3   5  2  2
4   6  3  3
5  10  3  4
6  11  3  4
7  12  3  4
8  13  4  5
9  18  4  6

相关问题