удалить дубликаты из данных с определенными условиями - PullRequest
0 голосов
/ 11 сентября 2018

У меня есть следующий фрейм данных

my_id  field_1   field_2   field_3 ...  field_100
1         :
1         :      
1
1 
2
2
3
3
3

Я хочу сохранить только одну строку для каждого my_id, используя запись с ненулевым, минимумом field_1.За исключением циклического прохождения всего фрейма данных, есть ли элегантный способ приблизиться к этому?Спасибо!

Ответы [ 2 ]

0 голосов
/ 11 сентября 2018

Вы можете использовать idxmin, так как он уже позаботится как о NaN (не будет рассматриваться), так и min (будет выбран)

df.loc[df.groupby('myid').field_1.idxmin()]
0 голосов
/ 11 сентября 2018

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
...