我有以下数据框
my_id field_1 field_2 field_3 ... field_100
1 :
1 :
1
1
2
2
3
3
3我希望使用具有非空的最小field_1的记录,为每个my_id只保留一行。除了遍历整个数据帧之外,有没有一种优雅的方法来实现这一点呢?谢谢!
发布于 2018-09-11 07:37:59
IIUC:
df.sort_values(['myid','field_1']).drop_duplicates(['my_id'])这之所以有效,是因为默认情况下,sort_values将空值放在最后,而drop_duplicates保留第一个空值。因此,如果按field_1对其进行排序,则第一个值将是最低的非空值。
示例:
>>> df
myid field_1 field_2
0 1 NaN 0.832445
1 1 3.0 0.742906
2 1 2.0 0.392163
3 2 2.0 0.089412
4 2 NaN 0.815754
5 2 1.0 0.615426
>>> df.sort_values(['myid','field_1']).drop_duplicates(['myid'])
myid field_1 field_2
2 1 2.0 0.392163
5 2 1.0 0.615426另一种方法是排序,然后使用groupby并选择first (但我认为效率较低):
>>> df.sort_values('field_1').groupby('myid', as_index=False).first()
myid field_1 field_2
0 1 2.0 0.392163
1 2 1.0 0.615426发布于 2018-09-11 08:22:41
您可以使用idxmin,因为它已经兼顾了NaN(不考虑)和min (将被挑选)
df.loc[df.groupby('myid').field_1.idxmin()]https://stackoverflow.com/questions/52266809
复制相似问题