Pandas - Удалять дубликаты при заполнении указанных c строк (заполнять по строкам) - PullRequest
1 голос
/ 28 мая 2020

У меня есть DataFrame, который выглядит следующим образом:

>> pd.DataFrame([["Anne", True, 1, "A"],["Bert", True, None, "B"],["Conan", False, 0, None],["Bert", None, None, None],["Conan", None, None, "C"],["Bert",None,2,None]], columns = ["Name", "Bool", "Int", "Char"])

    Name   Bool  Int  Char
0   Anne   True  1.0     A
1   Bert   True  NaN     B
2  Conan  False  0.0  None
3   Bert   None  NaN  None
4  Conan   None  NaN     C
5   Bert   None  2.0  None

Я хочу

  1. Удалить дубликаты на основе столбца
  2. При удалении процесса, оставьте строки с меньшим количеством NaN
  3. Если возможно, заполните значения Nan, используя набор строк (при условии)

Я могу выполнить (1) и (2) , Я не могу понять, как выполнить (3)

Часть 1 и 2

>>> def remove_duplicates_smartly(df, columns):
        df.assign(nan_count= df.isna().sum(axis=1), inplace=True) 
        df.sort_values(['nan_count'], inplace=True).drop_duplicates(columns, inplace=True)
        df.drop(columns=["nan_count"], inplace=True)
        return df

>>> my_df = pd.DataFrame([["Anne", True, 1, "A"],["Bert", True, None, "B"],["Conan", False, 0, None],["Bert", None, None, None],["Conan", None, None, "C"],["Bert",None,2,None]], columns = ["Name", "Bool", "Int", "Char"])
>>> remove_duplicates_smartly(my_df)

>>> remove_duplicates_smartly(my_df, ["Name"])

    Name   Bool  Int  Char
0   Anne   True  1.0     A
1   Bert   True  NaN     B
2  Conan  False  0.0  None

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

Текущие отсутствующие значения могут быть заполнены с помощью -удаленные строки. Новые значения должны быть взяты из строк, которые скоро будут удалены, у которых есть общее значение (выбранное пользователем) (в данном случае Имя)

    Name   Bool  Int  Char
0   Anne   True  1.0     A
1   Bert   True  2.0     B
2  Conan  False  0.0     C

1 Ответ

1 голос
/ 28 мая 2020

Для замены значений для каждой группы, указанной столбцами, возможно использование пользовательской лямбда-функции с прямым и обратным заполнением значений None или NaN s.

Решение работает правильно, если группировка столбцов заполнена не пропущенными значениями как Name.

columns = 'Name'
df = df.groupby(columns).apply(lambda x: x.ffill().bfill()).drop_duplicates(columns)
print (df)
    Name   Bool  Int Char
0   Anne   True  1.0    A
1   Bert   True  2.0    B
2  Conan  False  0.0    C
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...