python - 在列表中,python 删除重复的dataframes

  显示原文与译文双语对照的内容

我在 python 中有一个包含重复dataframes的列表。 我们的目标是在整个过程中移除这些重复的dataframes 。 下面是一些代码:


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 列表中删除任何重复的dataframes?

谢谢你

时间:

list comprehension 中可以使用 Pandas DataFrame.equalsenumerate 来比较列表中的项,从而进行比较:


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]



如果比较的dataframes相等,则 DataFrame.equals 返回 True:


df1.equals(df1)


True



df1.equals(df2)


False



你的列表应该按如下方式排序 [df1, df1, df1, df2, df2, df2] 或者更多:df [df1, df1, df2, df2, df3, df3]

我在用 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]



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

可以使用 /functools,将它们全部设置为单个 dataframe,使用 reduce的唯一值:


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



...