如何识别一列连续的数字和另一列相同的值?



我有一个包含两列AB的DataFrame

我想创建一个名为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]})

我发现了一个类似的问题,但该方法只识别连续的A,而不管B

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

我试着按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

让我们使用groupby,diffcumsum然后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

使用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

最新更新