【问题标题】:How to merge two CSV files by Python based on the common information in both files?Python如何根据两个文件的共同信息合并两个CSV文件?
【发布时间】:2016-01-12 13:10:54
【问题描述】:

埃文斯, 万分感谢。这几乎是预期的结果。请帮忙修改如下。 我们需要一点改变。请看一下图像。 在当前结果中,fileOne 中的每条记录都在 fileTwo 中搜索相似的 adv_id 和 user_id,当找到一条记录时,将其停止。但可能性是fileTwo中可能有几条类似的记录。因此,我们需要来自 fileTwo 的所有类似记录。并且fileOne 的所有记录必须至少在fileTwo 中可用一次或多次。因此,我们应该包括 fileOne 的所有记录以及来自 fileTwo 的所有类似记录。我认为逐行搜索可能会有所帮助。即取 fileOne 的 first 的 adv_id 和 user_id 并搜索 fileTwo 中的所有记录以找到相似的记录。接下来使用 fileOne 的第二条记录并搜索 fileTwo 中的所有记录。等等。

Revised Image For Expected Result

【问题讨论】:

  • 您好。这是您需要的一个很好的陈述,但我没有看到任何证据表明您已经尝试过某些东西。您是否可以告诉我们您在尝试编写本文时遇到了什么问题,或者如果您还没有这样做,请先尝试一下,然后在必要时修改问题以说明您遇到了什么困难?
  • conv_id 如何影响合并?当在两个文件中都找到匹配的条目时,需要保留哪一个?
  • 目前写的问题没有意义;看起来编辑删除了原始上下文。

标签: python csv merge


【解决方案1】:

以下脚本将根据您的原始示例数据创建result.csv(请参阅过去对问题的编辑):

import csv
from collections import defaultdict

d_entries = defaultdict(list)

with open('fileTwo.csv', 'r') as f_fileTwo:
    csv_fileTwo = csv.reader(f_fileTwo)
    header_fileTwo = next(csv_fileTwo)
    for cols in csv_fileTwo:
        d_entries[(cols[0], cols[1])].append([cols[0], ''] + cols[1:])

with open('fileOne.csv', 'r') as f_fileOne, open('result.csv', 'w', newline='') as f_result:
    csv_fileOne = csv.reader(f_fileOne)
    csv_result = csv.writer(f_result)
    header_fileOne = next(csv_fileOne)
    csv_result.writerow(header_fileOne)

    for cols in csv_fileOne:
        if (cols[0], cols[2]) in d_entries:
            csv_result.writerow(cols)
            csv_result.writerows(d_entries.pop((cols[0], cols[2])))

result.csv 在 Excel 中打开时将包含以下数据:

在 Python 3.4.3 中测试

仅匹配 adv_id 列并包含所有条目:

import csv
from collections import defaultdict

d_entries = defaultdict(list)

with open('fileTwo.csv', 'r') as f_fileTwo:
    csv_fileTwo = csv.reader(f_fileTwo)
    header_fileTwo = next(csv_fileTwo)
    for cols in csv_fileTwo:
        d_entries[cols[0]].append([cols[0], ''] + cols[1:])

with open('fileOne.csv', 'r') as f_fileOne, open('result.csv', 'w', newline='') as f_result:
    csv_fileOne = csv.reader(f_fileOne)
    csv_result = csv.writer(f_result)
    header_fileOne = next(csv_fileOne)
    csv_result.writerow(header_fileOne)

    for cols in csv_fileOne:
        if cols[0] in d_entries:
            csv_result.writerows(d_entries.pop(cols[0]))
        csv_result.writerow(cols)

【讨论】:

  • Hello Evans 非常感谢 1. conv_id 现在不应该影响合并过程。可用于合并后的排序。 all_cv 文件包含转换用户的信息,所以 cvflg = 1。 non_cv 文件包含未转换用户的信息,所以设置 cvflg = 0。保留两个文件的所有条目,不要重叠。发现运行时错误:文件“join_cv_noncv.py”,第 9 行,在 header_noncv = next(csv_noncv) _csv.Error: iterator 应该返回字符串,而不是字节(您是否以文本模式打开文件?)请查看并修改因此。问候,托法
  • 我猜您使用的是 Python 3,它是为 Python 2 编写的。它现在应该可以在 Python 3 中使用。请注意,如果输出不是必需的,请编辑问题以包含示例输入对于文件和预期输出。
  • 当前版本仅适用于 Python 3。
  • 由于您选择不使用 Python 的 CSV 处理,您需要在 Pandas 数据帧上执行类似df.to_csv('out.csv') 的操作。
  • 您不应将代码发布到 cmets。没有什么可以阻止您编辑您的问题以包含此内容(有一个编辑按钮)。正如我已经问过的,包含示例输入文件和预期输出也会有所帮助。
猜你喜欢
  • 2019-03-27
  • 2014-03-31
  • 2012-08-12
  • 2023-04-03
  • 2020-03-18
  • 2022-10-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多