获取组中的第一行并分配值
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)
我有一个 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)