【问题标题】:How can I merge CSV rows that have the same value in the first cell?如何合并第一个单元格中具有相同值的 CSV 行?
【发布时间】:2017-01-28 21:40:45
【问题描述】:

这是文件:https://drive.google.com/file/d/0B5v-nJeoVouHc25wTGdqaDV1WW8/view?usp=sharing

如您所见,第一列中有重复项,但如果我要合并重复的行,则其他列中的数据不会被覆盖。有什么方法可以将第一列中具有重复值的行组合起来?

例如,将“1,A,A,”和“1,,,T,T”转换为“1,A,A,T,T”。

【问题讨论】:

  • 正在使用pandas ok 还是您正在寻找普通python 中的解决方案?

标签: python csv bioinformatics jupyter-notebook libreoffice-calc


【解决方案1】:

普通 Python:

import csv

reader = csv.Reader(open('combined.csv'))
result = {}

for row in reader:
    idx = row[0]
    values = row[1:]
    if idx in result:
        result[idx] = [result[idx][i] or v for i, v in enumerate(values)]
    else:
        result[idx] = values

这个魔法是如何运作的:

  • 遍历 CSV 文件中的行
  • 对于每条记录,我们检查之前是否存在具有相同索引的记录
  • 如果这是我们第一次看到这个索引,只需复制行值
  • 如果这是重复的,请将行值分配给空单元格。

最后一步是通过or 技巧完成的:None or value 将返回valuevalue or anything 将返回 value。因此,result[idx][i] or v 将返回现有值,如果它不为空,或行值。

为了在不丢失重复行的情况下输出这个,我们需要保留索引,然后迭代并输出对应的result条目:

indices = []
for row in reader:
    # ...
    indices.append(idx)

writer = csv.writer(open('outfile.csv', 'w'))
for idx in indices:
    writer.writerow([idx] + result[idx])

【讨论】:

  • 谢谢,这是一个优雅的解决方案。你知道我怎样才能在不丢失非重复行的情况下将其输出到 csv 文件吗?
  • @MaxPeart,添加到答案中
猜你喜欢
  • 1970-01-01
  • 2022-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-21
  • 2017-01-08
  • 1970-01-01
相关资源
最近更新 更多