Удаление дублирующихся строк, но с сохранением определенных значений Pandas - PullRequest
0 голосов
/ 16 января 2019

У меня есть 2 аналогичных кадра данных, которые я объединил, которые имеют много повторяющихся значений, потому что в основном это один и тот же набор данных, но за разные годы.

Проблема в том, что в одном из наборов отсутствуют некоторые значения, в то время как в другом иногда эти значения.

Например:

Name        Unit       Year      Level
Nik         1          2000      12
Nik         1                    12
John        2          2001      11
John        2          2001      11
Stacy       1                    8
Stacy       1          1999      8
.
.

Я хочу удалить дубликаты на subset = ['Name', 'Unit', 'Level'], так как у некоторых повторений нет лет.

Однако у меня остались данные, у которых нет Year, и я хотел бы сохранить данные со следующими значениями:

Name        Unit       Year      Level
Nik         1          2000      12
John        2          2001      11
Stacy       1          1999      8
.
.

Как сохранить эти значения, а не пробелы?

Ответы [ 3 ]

0 голосов
/ 16 января 2019

Одно решение, которое приходит на ум, - это сначала отсортировать объединенный фрейм данных по годам с помощью функции sortvalues: https://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.sort_values.html затем удалите дубликаты с параметром keep = 'first'

df.drop_duplicates(subset=['Name', 'Unit', 'Level'], keep="first")
0 голосов
/ 16 января 2019

Я бы посоветовал вам взглянуть на шаг создания вашего объединенного набора данных.

При объединении наборов данных вы можете сделать это по нескольким индексам, т.е.

df = pd.merge(left, right, how='outer', on=['Name', 'Unit', 'Level'],  suffixes=['', '_r'])

С помощью внешнего объединения вы собираете все наборы данных и сразу удаляете дубликаты. Осталось только объединить столбец Year, который вы можете сделать так:

df['Year'] = df[['Year', 'Year_r']].apply(lambda x: x['Year'] if (x['Year'] is not np.nan and x['Year'] != '') else x['Year_r'], axis=1)

Это заполняет пробелы, и после этого вы можете просто удалить столбец 'Year_r'.

Преимущество заключается в том, что охватываются не только значения NaN пропущенных лет, но и пропущенные годы, представленные в виде пустых строк.

Вслед за небольшим рабочим примером:

import pandas as pd
import numpy as np


left = pd.DataFrame({'Name': ['Adam', 'Beatrice', 'Crissy', 'Dumbo', 'Peter', 'Adam'],
                     'Unit': ['2', '4', '6', '2', '4', '12'],
                     'Year': ['', '2009', '1954', '2025', '2012', '2024'],
                     'Level': ['L1', 'L1', 'L0', 'L4', 'L3', 'L10']})

right = pd.DataFrame({'Name': ['Adam', 'Beatrice', 'Crissy', 'Dumbo'],
                     'Unit': ['2', '4', '6', '2'],
                     'Year': ['2010', '2009', '1954', '2025'],
                     'Level': ['L1', 'L1', 'L0', 'L4']})

df = pd.merge(left, right, how='outer', on=['Name', 'Unit', 'Level'],  suffixes=['', '_r'])
df['Year'] = df[['Year', 'Year_r']].apply(lambda x: x['Year'] if (x['Year'] is not np.nan and x['Year'] != '') else x['Year_r'], axis=1)
df
0 голосов
/ 16 января 2019

Используйте sort_values с параметром по умолчанию na_position='last', поэтому его следует опустить, а затем drop_duplicates:

print (df)
    Name  Unit    Year  Level
0    Nik     1     NaN     12
1    Nik     1  2000.0     12
2   John     2  2001.0     11
3   John     2  2001.0     11
4  Stacy     1     NaN      8
5  Stacy     1  1999.0      8

subset = ['Name', 'Unit', 'Level']
df = df.sort_values('Year').drop_duplicates(subset)

Или:

df = df.sort_values(subset + ['Year']).drop_duplicates(subset)

print (df)
    Name  Unit    Year  Level
5  Stacy     1  1999.0      8
1    Nik     1  2000.0     12
2   John     2  2001.0     11

Другое решение с GroupBy.first для возврата первого не пропущенного значения Year для групп:

df = df.groupby(subset, as_index=False, sort=False)['Year'].first()
print (df)
    Name  Unit  Level    Year
0    Nik     1     12  2000.0
1   John     2     11  2001.0
2  Stacy     1      8  1999.0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...