我有以下数据框
my_id field_1 field_2 field_3 ... field_100
1 :
1 :
1
1
2
2
3
3
3
我想使用最少为my_id
的非空记录,每个field_1
仅保留一行。除了在整个数据帧上循环外,是否有一种优雅的方法可以解决此问题?谢谢!
答案 0 :(得分:1)
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
答案 1 :(得分:1)
您可以使用idxmin
,因为它已经处理了NaN
(将不被考虑)和min
(将被选择)
df.loc[df.groupby('myid').field_1.idxmin()]