获取组中的第一行并赋值



我有一个熊猫数据框架,格式如下

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

我需要根据id, name, 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。

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

duplicated将比groupby更快:

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

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

最新更新