【问题标题】:Removing duplicate dataframes in a list删除列表中的重复数据框
【发布时间】:2019-09-08 03:22:34
【问题描述】:

我在 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 列表中删除任何重复的数据帧?

谢谢

【问题讨论】:

  • 你想在列表中删除重复项还是作为数据框?
  • 如果整个数据帧与列表中的另一个数据帧完全相同,我想删除它。
  • 由于您有相同的列,因此从列表中的数据帧中创建一个大数据帧并像 Engineero 那样删除重复项是合乎逻辑的。但显然,你不希望这样。
  • 如果数据相同,但索引顺序不同(即只是交换其中一个DataFrames的行)是否重复?

标签: python pandas dataframe duplicates


【解决方案1】:

我正在处理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]

【讨论】:

  • @Jake 我的意思是 Erfan 的方法很好用 [df1,df1, df2,df2] 检查重复项,但是,不是 [df1,df2,df1,df2]..
  • @Erfan 顺便说一句,您可以使用[[x.equals(y) for x in all_df_list] for y in all_df_list] 修复此问题,然后找到具有上述输出的重复项和唯一项
【解决方案2】:

我们可以使用 pandas DataFrame.equalslist 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

注意 正如文本在 cmets 中指出的那样。您的列表应该像[df1, df1, df1, df2, df2, df2] 一样排序。或者有更多的df:[df1, df1, df2, df2, df3, df3]

【讨论】:

  • 是的,这正是我们想要的结果!谢谢!!
  • @Jake 只是一个问题,你的重复总是显示为 df1,df1,df1,df3,df3 或,它可能是 df1,df2,df3,df1,df2,df2
  • @Wen-Ben 我只是想快速表示一个包含重复数据框的列表
  • @Erfan 如果您的所有数据帧都相等,那么这将导致空数据帧
【解决方案3】:

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

您可以使用来自functoolsreduce 将它们全部pd.merge() 放入具有唯一值的单个数据帧中:

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

【讨论】:

  • 感谢您的回答,但我确实需要在列表中保留单个数据框。合并文件不适用于我的应用程序。
【解决方案4】:

有一个新的 Python 库 pyoccur 可以轻松做到这一点。

from pyoccur import pyoccur
pyoccur.remove_dup(all_df_list)

输出:

 0   1  2018     80
 1   2  2018     70,    ID  Year  Score
 0   1  2017     77
 1   3  2017     62]

【讨论】:

    【解决方案5】:

    您只需将重复的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
    

    【讨论】:

      猜你喜欢
      • 2012-11-13
      • 1970-01-01
      • 2020-11-14
      • 1970-01-01
      • 2021-06-14
      • 2019-11-19
      • 1970-01-01
      • 1970-01-01
      • 2015-01-06
      相关资源
      最近更新 更多