Python - Удалить дубликаты в кадре данных на основе двух комбинаций столбцов? - PullRequest
0 голосов
/ 05 июля 2018

У меня есть датафрейм с 3 столбцами в Python:

Name1 Name2 Value
Juan  Ale   1
Ale   Juan  1

и хотел бы удалить дубликаты на основе комбинаций столбцов Name1 и Name2.

В моем примере обе строки равны (но они в другом порядке), и я хотел бы удалить вторую строку и просто оставить первую, поэтому конечный результат должен быть:

Name1 Name2 Value
Juan  Ale   1

Любая идея будет по достоинству оценена!

Ответы [ 3 ]

0 голосов
/ 05 июля 2018

Используя np.sort с duplicated

df[pd.DataFrame(np.sort(df[['Name1','Name2']].values,1)).duplicated()]
Out[614]: 
  Name1 Name2  Value
1   Ale  Juan      1

Производительность

df=pd.concat([df]*100000)

%timeit df[pd.DataFrame(np.sort(df[['Name1','Name2']].values,1)).duplicated()]
10 loops, best of 3: 69.3 ms per loop
%timeit df[~df[['Name1', 'Name2']].apply(frozenset, axis=1).duplicated()]
1 loop, best of 3: 3.72 s per loop
0 голосов
/ 05 июля 2018

Знаю, я опаздываю на этот вопрос, но все равно делаю свой вклад :)

Вы также можете использовать get_dummies и add для хорошего способа создания хэшируемых строк

df[~(pd.get_dummies(df.a).add(pd.get_dummies(df.b), fill_value=0)).duplicated()]

Времена не так хороши, как ответ @ Вэнь Цзябао, но это все же намного быстрее, чем apply + frozen_set

df=pd.concat([df]*1000000)
%timeit df[~(pd.get_dummies(df.a).add(pd.get_dummies(df.b), fill_value=0)).duplicated()]
1.8 s ± 85 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

%timeit df[pd.DataFrame(np.sort(df[['a','b']].values,1)).duplicated()]
1.26 s ± 19 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

%timeit df[~df[['a', 'b']].apply(frozenset, axis=1).duplicated()]
1min 9s ± 684 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
0 голосов
/ 05 июля 2018

Вы можете конвертировать в frozenset и использовать pd.DataFrame.duplicated.

res = df[~df[['Name1', 'Name2']].apply(frozenset, axis=1).duplicated()]

print(res)

  Name1 Name2  Value
0  Juan   Ale      1

frozenset необходимо вместо set, поскольку duplicated использует хеширование для проверки на наличие дубликатов.

Масштабируется лучше со столбцами, чем со строками. Для большого количества строк используйте алгоритм сортировки @ Wen.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...