在Pandas中标记组中的第一个类别

时间:2017-03-08 15:56:19

标签: python pandas

我有一个带有两个组指示器的数据框,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

我在组中尝试了各种版本的滚动计数,但无法获得所需的结果。

谢谢!!!

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