Удаление дубликатов данных в списке - PullRequest
3 голосов
/ 17 апреля 2019

У меня есть список в Python, который содержит дубликаты данных.Цель состоит в том, чтобы удалить эти дубликаты данных в целом.Вот некоторый код:

import pandas as pd
import numpy as np
##Creating Dataframes
data1_1 =[[1,2018,80], [2,2018,70]]

data1_2 =  [[1,2017,77], [3,2017,62]]


df1 = pd.DataFrame(data1_1, columns = ['ID', 'Year', 'Score'])
df2 = pd.DataFrame(data1_2, columns = ['ID', 'Year', 'Score'])


###Creating list with duplicates
all_df_list = [df1,df1,df1,df2,df2,df2]

Желаемый результат таков:

###Desired results
desired_list = [df1,df2]

Есть ли способ удалить все дублированные кадры данных в списке Python?

Спасибовы

Ответы [ 4 ]

3 голосов
/ 17 апреля 2019

Я делаю с numpy.unique

_,idx=np.unique(np.array([x.values for x in all_df_list]),axis=0,return_index=True)
desired_list=[all_df_list[x] for  x in idx ]
desired_list
Out[829]: 
[   ID  Year  Score
 0   1  2017     77
 1   3  2017     62,    ID  Year  Score
 0   1  2018     80
 1   2  2018     70]
2 голосов
/ 17 апреля 2019

Мы можем использовать панд DataFrame.equals с list comprehension в сочетании с enumerate, чтобы сравнить элементы в списке между собой:

desired_list = [all_df_list[x] for x, _ in enumerate(all_df_list) if all_df_list[x].equals(all_df_list[x-1]) is False]

print(desired_list)
[   ID  Year  Score
0   1  2018     80
1   2  2018     70,    ID  Year  Score
0   1  2017     77
1   3  2017     62]

DataFrame.equals возвращает True, если сравниваемые кадры данных равны:

df1.equals(df1)
True

df1.equals(df2)
False

Примечание Как отметил Вэнь-Бен в комментариях.Ваш список должен быть отсортирован как [df1, df1, df1, df2, df2, df2].Или с большим количеством df: [df1, df1, df2, df2, df3, df3]

1 голос
/ 17 апреля 2019

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

Вы можете pd.merge() всех их в одном кадре данных с уникальными значениями, используя reduce из functools:

from functools import reduce
reduced_df = reduce(lambda left, right: pd.merge(left, right, on=None, how='outer'),
                    all_df_list)
print(reduced_df)
#    ID  Year  Score
# 0   1  2018     80
# 1   2  2018     70
# 2   1  2017     77
# 3   3  2017     62
0 голосов
/ 18 апреля 2019

Вам просто нужно передать список дубликатов df's на pd.Series, удалить дубликат и преобразовать его обратно в список

In [229]: desired_list = pd.Series(all_df_list).drop_duplicates().tolist()

In [230]: desired_list
Out[230]:
[   ID  Year  Score
 0   1  2018     80
 1   2  2018     70,    ID  Year  Score
 0   1  2017     77
 1   3  2017     62]

Финальный desired_list содержит 2 кадра данных, равных df1, df2

In [231]: desired_list[0] == df1
Out[231]:
     ID  Year  Score
0  True  True   True
1  True  True   True

In [232]: desired_list[1] == df2
Out[232]:
     ID  Year  Score
0  True  True   True
1  True  True   True
...