【问题标题】:Trying to combine entries in csv file by keeping the first entry尝试通过保留第一个条目来合并 csv 文件中的条目
【发布时间】:2021-07-13 02:14:35
【问题描述】:

我正在尝试编写一个 python 脚本来组合 csv 文件中的条目。

a, 1, A
a, 2, B
b, 3, C
b, 4, D

a, 1, A, 2, B
b, 3, C, 4, D

下图显示了我的 csv 文件的更完整图片。

我尝试过使用 csv 和 pandas 库,但我迷路了。我是编码新手,现在这超出了我的想象。

编辑:每个字母并不总是 2 行,它可能会有所不同,如果是这种情况,每个字母都会添加到该行中,例如它可能是

a, 1, A, 2, B, 3, C, 4, D

b、5、E、6、F

c, 7, G, 8, H, 9, J, 10, K, 11, L, 12, M –

【问题讨论】:

  • 欢迎来到 Stack Overflow!请拨打tour,阅读what's on-topic hereHow to Askquestion checklist,并提供minimal reproducible example。 “为我实现此功能”与此站点无关。你必须诚实地尝试,然后就你的算法或技术提出一个具体问题
  • 这里有一个提示:创建一个data 字典来存储所有数据。此 dict 的键将是每行的第一个元素。该值将是一个列表,其中包含您在最终结果中想要的所有元素。读取 csv 文件,并遍历每一行。每行的第一个元素告诉你“关键”。如果data 中不存在此键,请将其设置为当前行。如果它确实存在于data 中,则将当前行的其他元素附加到预先存在的值中。完成后,此字典的值会为您提供新 csv 文件的行
  • 当第一个字母的组有两行时,您已经显示了该值;如果没有怎么办?
  • @Neil,每个字母并不总是 2 行,它可能会有所不同,如果是这种情况,每个字母都会添加到行中,例如它可能是 a、1、A、 2, B, 3, C, 4, D b, 5, E, 6, F c, 7, G, 8, H, 9, J, 10, K, 11, L, 12, M
  • @Seth -- 我建议通过编辑将这个解释添加到问题中。任何澄清细节都应包含在问题中,以便那些试图回答的人不需要通过评论线程。

标签: python csv


【解决方案1】:

defaultdict 足够简单

from io import StringIO
import csv
import sys
from collections import defaultdict

data = '''\
a, 1, A
a, 2, B
b, 3, C
b, 4, D
b, 5, E
c, 6, F
'''

out = defaultdict(list)

f = StringIO(data)
reader = csv.reader(f)

for (x, y, z) in reader:
    out[x].extend([y, z])

writer = csv.writer(sys.stdout)
for k, v in out.items():
    writer.writerow([k] + v)

输出

a, 1, A, 2, B
b, 3, C, 4, D, 5, E
c, 6, F

【讨论】:

    【解决方案2】:

    您可以将itertools.groupbyoperator.itemgetteritertools.chain 结合使用:

    这里主要是groupby 按第一项分组,然后itemgetter 是更复杂的lambda x: x[n]chain 只是为我们组合了多个迭代。

    from itertools import groupby, chain
    from operator import itemgetter
    
    data = [['a', 1, 'A'],
            ['a', 2, 'B'],
            ['b', 3, 'C'],
            ['b', 4, 'D']]
            
    output = [[k, *chain(*map(itemgetter(1,2), g))] for k, g in groupby(data, itemgetter(0))]
    print(output)
    

    [['a', 1, 'A', 2, 'B'], ['b', 3, 'C', 4, 'D']]
    

    注意:确保行按第一个键排序,否则将无法按预期工作。如果是这种情况,您可能希望使用 collections.defaultdict 代替它

    【讨论】:

      猜你喜欢
      • 2016-03-24
      • 2013-05-29
      • 2018-02-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-28
      相关资源
      最近更新 更多