我有一个包含两列A
和B
的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
,diff
和cumsum
然后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
来比较不等于1
和Series.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