【问题标题】:Read large csv file with many duplicate values, drop duplicates while reading读取具有许多重复值的大型 csv 文件,在读取时删除重复项
【发布时间】:2015-03-04 16:51:49
【问题描述】:

我有以下 pandas 代码 sn-p,它读取在我的 .csv 文件的特定列中找到的所有值。

sample_names_duplicates = pd.read_csv(infile, sep="\t", 
                                      engine="c", usecols=[4],
                                      squeeze=True)

我文件的那个特定列最多包含 20 个值(样本名称),因此如果我可以动态删除重复项而不是存储它们然后删除重复项,它可能会更快。这是否可以删除以某种方式发现的重复项?

如果没有,有没有办法更快地做到这一点,而不必让用户明确命名她文件中的样本名称是什么?

【问题讨论】:

    标签: python csv pandas


    【解决方案1】:

    不是“即时”,尽管drop_duplicates 应该足够快以满足大多数需求。

    如果您想即时执行此操作,则必须手动跟踪特定列上的重复项:

    import csv
    
    seen = [] # or set()
    dup_scan_col = 3
    uniques = []
    
    with open('yourfile.csv', 'r') as f:
        reader = csv.reader(f, delimiter='\t')
        for row in reader:
           if row[dup_scan_col] not in seen:
              uniques.append(row)
              seen.append(row[dup_scan_col])
    

    【讨论】:

      【解决方案2】:

      由于read_csv() 返回的结果是可迭代的,您可以将其包装在set() 调用中以删除重复项。请注意,使用 set 会丢失您可能拥有的任何排序。如果你想排序,你应该使用list()sort()

      唯一无序集示例:

      sample_names_duplicates = set(pd.read_csv(infile, sep="\t", engine="c", usecols=[4], squeeze=True))
      

      有序列表示例:

      sample_names = list(set(pd.read_csv(infile, sep="\t", engine="c", usecols=[4], squeeze=True)))
      sample_names.sort()
      

      【讨论】:

      • 会试试这个,想知道它是否会即时删除重复项。
      • 虽然read_csv()实际上会返回重复值,但这样我们会删除返回的重复值。
      • 接受这一点,直到有人找到更快的方法。
      猜你喜欢
      • 2019-01-07
      • 2016-02-22
      • 1970-01-01
      • 2017-08-07
      • 1970-01-01
      • 1970-01-01
      • 2013-06-18
      • 2013-04-06
      相关资源
      最近更新 更多