Python 删除列表中的重复数据帧

Python 删除列表中的重复数据帧,python,pandas,dataframe,duplicates,Python,Pandas,Dataframe,Duplicates,我有一个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'])

我有一个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列表中的任何重复数据帧


谢谢

我的第一个想法是使用集合,但数据帧是可变的,因此不可散列。您是否仍然需要列表中的单个数据帧,或者将所有这些数据帧合并到具有所有唯一值的单个数据帧中是否有用

您可以使用以下命令将它们全部添加到具有唯一值的单个数据帧中:


我正在使用
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]
我们可以将pandas与
列表理解
结合使用
枚举
来比较列表中的项目:

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]
您只需将重复的
df的列表传递到
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]
最终的
所需\u列表
保存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

谢谢您的回答,但我确实需要在列表中保留各个数据帧。合并文件对我的应用程序不起作用。是否要在列表中删除重复的数据帧或作为数据帧删除?如果整个数据帧与列表中的另一个数据帧完全重复,则我要删除它。因为您有相同的列,从列表中的数据帧中生成一个大数据帧并像Engineero那样删除重复项是合乎逻辑的。但显然,您不希望这样。如果数据相同,但索引顺序不同(即,只交换其中一个数据帧的行),这是否是重复的?是的,这正是所需的结果!谢谢@杰克,只有一个问题,你的复制品总是显示为df1,df1,df1,df3,df3或者,它可能是df1,df2,df3,df1,df2,df2@Wen-Ben我只是想用重复的数据帧快速表示一个列表it@Erfan如果所有数据帧都相等,那么这将导致空dataframe@Jake我的意思是,Erfan的方法很好,它将使用[df1,df1,df2,df2]检查复制的数据,但是,不是[df1,df2,df1,df2]。@Erfan顺便说一句,您可以使用
[[x.equals(y)表示所有测向列表中的x]表示所有测向列表中的y]
然后使用上述输出查找重复的和唯一的
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