【问题标题】:Python - Selecting All Row Values That Meet A particular Criteria OncePython - 一次选择满足特定条件的所有行值
【发布时间】:2014-12-02 12:52:00
【问题描述】:

我有一个设置了以下字段的表单:日期时间、ID 和地址。此表单自动为每个条目分配一个唯一的 id 字符串 (U_ID),然后将此数据稍后输出到带有标题和行的 csv,如下所示:

Date Time       ID    U_ID     Address
9/12/13 12:07   13    adfasd   1345 Wilson Way
9/12/13 13:45   8     jklj     1456 Jackson Hollow
9/13/13 14:55   13    klidh    1345 Wilson Way
9/13/13 15:00   8     ikodl    1456 Jackson Hollow

我正在寻找一种方法来通过 Python 脚本删除具有相同 ID 的重复提交,同时保留行中的其余数据。理想情况下,我只想保留与 csv 文件中的 ID 关联的第一个条目。

输出应如下所示:

Date Time       ID    U_ID     Address
9/12/13 12:07   13    adfasd   1345 Wilson Way
9/12/13 13:45   8     jklj     1456 Jackson Hollow

到目前为止,我被困在:

import csv

with open('/Users/user/Desktop/test.csv', 'rb') as f:
r = csv.reader(f)
headers = r.next()
rows = [(Date Time, ID, U_ID, Address) for Date Time, ID, U_ID, Address in r]
clean = [row for row in rows if row[1] != '#N/A']
clean2 = list(set(row[1]))

这给了我一个只有 ID 唯一值的列表,但我不确定如何恢复与这些值的行关联的所有其他数据。

如前所述,如果我也能得到最早的提交,那就太好了,但老实说,任何唯一的 ID 提交都应该这样做。

感谢阅读!

【问题讨论】:

    标签: python csv python-3.x deduplication


    【解决方案1】:

    看看pandas,你会这样做:

    import pandas as pd
    
    pd.read_table('test.csv')\
      .drop_duplicates(subset=['ID'])\
      .to_csv('output.csv', index=None, sep='\t')
    

    输出.csv

    Date    Time    ID  U_ID    Address
    9/12/13 12:07   13  adfasd  1345 Wilson Way
    9/12/13 13:45   8   jklj    1456 Jackson Hollow
    

    【讨论】:

    • 工作就像一个魅力!谢谢 Elyase!
    【解决方案2】:

    首先,上面的文件是一个固定宽度的文件,而不是 csv。使用固定宽度的字符串索引。

    做你想做的最简单的方法是将独特的部分存储在一个集合中,这样你就可以快速检查它们是否已经被看到过。

    path = '/Users/user/Desktop/test.csv'
    already_read = set()
    with open(path, 'rb') as f:
        header = f.readline().strip()
        print header
        for line in f:
            unique_part = line[17:].strip()
            if unique_part in already_read:
                continue
            already_read.add(unique_part)
            print line.strip()
    

    如果文件是 TSV(制表符分隔文件),您可以使用 split 代替原始索引:

    path = '/Users/user/Desktop/test.csv'
    already_read = set()
    with open(path, 'rb') as f:
        header = f.readline().strip()
        print header
        for line in f:
            unique_part = '\t'.join(line.strip().split('\t')[2:])
            if unique_part in already_read:
                continue
            already_read.add(unique_part)
            print line.strip()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-12-24
      • 2011-12-28
      • 2014-02-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多