【问题标题】:Copy values from CSV rows and adding to rows where the ID is the same从 CSV 行复制值并添加到 ID 相同的行
【发布时间】:2014-08-13 13:29:03
【问题描述】:

我有一个与 ID 相关联的邮政编码 CSV。在不同的行中有多个不同的邮政编码归属于同一 ID。我的输入如下所示:

ID      Postal Code  
1001    MK18 1TN
1001    MK18 1TL
1002    HP17 6DG
1002    HP17 6DH

我想做的是为每个唯一 ID 创建一行,并列出该 ID 可用的所有关联邮政编码。

我追求的输出是这样的:

ID    Postal Codes
1001  MK18 1TN, MK18 1TL
1002  HP17 6DG, HP17 6DH

有人对我如何在 Python 或 SQL 中实现这一点有任何建议吗?

【问题讨论】:

  • 想想问题;听起来您希望 ID 列成为键。 defaultdict 容器在这里很有用。
  • 一点也不难——但你需要展示一些你尝试过的代码。我鼓励您查看 csv.DictReader,以便将每一行作为字典读取,然后您可以使用 collections.defaultdict 设置一些新字典,其中值是列表。话虽如此,我将投票结束这个问题,因为它还不是本网站旨在帮助解决的那种编程问题

标签: python mysql sql csv


【解决方案1】:

python 示例可能是:

#ID      Postal Code  
data = [
    ('1001', 'MK18 1TN'),
    ('1001', 'MK18 1TL'),
    ('1002', 'HP17 6DG'),
    ('1002', 'HP17 6DH'),
    ]
d = dict()
for id,pc in data:
    if id not in d:
        d[id] = []
    d[id].append(pc)
idkeys = d.keys()
idkeys.sort()
for k in idkeys:
    print k, ', '.join(d[k])

【讨论】:

    【解决方案2】:

    Python 中有很多方法,例如使用csv 模块读取输入(假设制表符是分隔符),并使用itertools.groupby()collections.defaultdict(list) 对其进行分组。这是groupby()

    import csv
    from itertools import groupby
    
    with open('postcodes.csv') as infile, open('result.csv', 'w') as outfile:
        reader = csv.reader(infile, delimiter='\t')
        writer = csv.writer(outfile, delimiter='\t')
        writer.writerow(next(reader))     # copies the column headers into the output CSV
        for _id, postcodes in groupby(reader, lambda row: row[0]):
            writer.writerow([_id, ', '.join(postcode[1] for postcode in postcodes)])
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-08-30
      • 2020-12-05
      • 2021-09-23
      • 1970-01-01
      • 1970-01-01
      • 2019-12-08
      • 1970-01-01
      • 2012-03-25
      相关资源
      最近更新 更多