Pandas - условные выпадающие дубликаты, основанные на количестве NaN - PullRequest
1 голос
/ 09 октября 2019

У меня есть датафрейм Pandas 0.24.2 для Python 3.7x, как показано ниже. Я хочу drop_duplicates() с тем же именем на основе условной логики. Подобный вопрос можно найти здесь: Панды - условные дубликаты отбрасывания , но в моем случае это усложняется

import pandas as pd
import numpy as np
df = pd.DataFrame({
          'Id':    [1,      2,      3,      4,      5,      6     ],
          'Name':  ['A',    'B',    'C',    'A',    'B',    'C'   ],
          'Value1':[1,      np.NaN, 0,      np.NaN, 1,      np.NaN],
          'Value2':[np.NaN, 0,      np.NaN, 1,      np.NaN, 0     ],
          'Value3':[np.NaN, 0,      np.NaN, 1,      np.NaN, np.NaN]
})

Как можно:

  1. Удалите дубликаты для тех же записей «Имя», сохраняя тот, у которого меньше NaN?

  2. Если у них одинаковое количество NaN, сохраните тот, у которого НЕ есть NaNin 'Value1'?

Желаемый результат будет:

    Id  Name  Value1  Value2  Value3
2   2    B     NaN      0       0
3   3    C     0        NaN     NaN       
4   4    A     NaN      1       1      

1 Ответ

2 голосов
/ 09 октября 2019

Идея заключается в создании вспомогательных столбцов для обоих условий, сортировке и удалении дубликатов:

df1 = df.assign(count= df.isna().sum(axis=1),
                count_val1 = df['Value1'].isna().view('i1'))
df2 = (df1.sort_values(['count', 'count_val1'])[df.columns]
          .drop_duplicates('Name')
          .sort_index())
print (df2)
   Id Name  Value1  Value2  Value3
1   2    B     NaN     0.0     0.0
2   3    C     0.0     NaN     NaN
3   4    A     NaN     1.0     1.0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...