获取组中的第一行并分配值

get first row in a group and assign values

我有一个 pandas 数据框,格式如下

 id   name  value_1  value_2
 1    def   1        0
 2    abc   0        1

我需要根据 ID、名称、value_1 和 value_2 对上述数据框进行排序。接下来,对于每组 [id,name,value_1,value_2],获取第一行并设置 df['result'] = 1。对于该组中的其他行,设置 df['result'] = 0.

我使用以下代码进行排序并获得第一行:

df = df.sort_values(["id","name","value_1","value_2"], ascending=True)
first_row_per_group = df.groupby(["id","name","value_1","value_2"]).agg('first')

得到第一行后,我设置first_row_per_group ['result'] = 1。但我不知道如何将其他行(非第一行)设置为0。

如有任何建议,我们将不胜感激。

使用 df.groupby(...).cumcount() 获取组内行的计数器,然后您可以对其进行操作。

In [51]: df
Out[51]:
     a  b  c
0  def  1  0
1  abc  0  1
2  def  1  0
3  abc  0  1

In [52]: df2 = df.sort_values(['a','b','c'])

In [53]: df2['result'] = df2.groupby(['a', 'b', 'c']).cumcount()

In [54]: df2['result'] = np.where(df2['result'] == 0, 1, 0)

In [55]: df2
Out[55]:
     a  b  c  result
1  abc  0  1       1
3  abc  0  1       0
0  def  1  0       1
2  def  1  0       0

duplicated 会比 groupby:

df = df.sort_values(['id', 'name', 'value_1', 'value_2'])
df['result'] = (~df['id'].duplicated()).astype(int)