我有一个带有两个组指示器的数据框,cat1和cat2。我想在cat1中标记cat2的第一次出现。
我有什么:
df = pd.DataFrame([['a','x'],['a','x'],['a','y'],['a','y'],['b','y'],['b','z'],['c','z']], columns = ['cat1', 'cat2'])
cat1 cat2
0 a x
1 a x
2 a y
3 a y
4 b y
5 b z
6 c z
我想获得什么:
cat1 cat2 flag
0 a x 1
1 a x 1
2 a y 0
3 a y 0
4 b y 1
5 b z 0
6 c z 1
我在组中尝试了各种版本的滚动计数,但无法获得所需的结果。
谢谢!!!
答案 0 :(得分:2)
你可以在'cat1'上groupby
然后调用transform
,它应用lambda
来比较'cat2'的值与第一个值,这将生成一个布尔数组然后我们可以使用int
转换为astype
:
In [166]:
df['flag'] = df.groupby('cat1')['cat2'].transform(lambda x: x== x.iloc[0]).astype(int)
df
Out[166]:
cat1 cat2 flag
0 a x 1
1 a x 1
2 a y 0
3 a y 0
4 b y 1
5 b z 0
6 c z 1
在这里你可以看到布尔输出:
In [167]:
df.groupby('cat1')['cat2'].transform(lambda x: x== x.iloc[0])
Out[167]:
0 True
1 True
2 False
3 False
4 True
5 False
6 True
Name: cat2, dtype: object
另一种方法是在比较中调用first
:
In [169]:
df['flag'] = (df['cat2'] == df.groupby('cat1')['cat2'].transform('first')).astype(int)
df
Out[169]:
cat1 cat2 flag
0 a x 1
1 a x 1
2 a y 0
3 a y 0
4 b y 1
5 b z 0
6 c z 1