【问题标题】:Merging two CSV files by a common column python通过公共列python合并两个CSV文件
【发布时间】:2016-07-26 19:26:01
【问题描述】:

我正在尝试将两个 csv 文件与一个公共 id 列合并,并将合并写入一个新文件。我尝试了以下方法,但它给了我一个错误 -

import csv
from collections import OrderedDict

filenames = "stops.csv", "stops2.csv"
data = OrderedDict()
fieldnames = []
for filename in filenames:
    with open(filename, "rb") as fp:  # python 2
        reader = csv.DictReader(fp)
        fieldnames.extend(reader.fieldnames)
        for row in reader:
            data.setdefault(row["stop_id"], {}).update(row)

fieldnames = list(OrderedDict.fromkeys(fieldnames))
with open("merged.csv", "wb") as fp:
    writer = csv.writer(fp)
    writer.writerow(fieldnames)
    for row in data.itervalues():
        writer.writerow([row.get(field, '') for field in fieldnames])

两个文件都有“stop_id”列,但我又收到了这个错误 - KeyError: 'stop_id'

任何帮助将不胜感激。

谢谢

【问题讨论】:

  • data.setdefault(row["stop_id"], {}).update(row) - 为什么这么复杂?
  • 另外,按列合并两个表是用pandas.merge完成的,见这里pandas.pydata.org/pandas-docs/stable/…
  • 我使用了另一个堆栈溢出示例作为对此的输入。你能建议一个替代方案吗?谢谢
  • 太好了,感谢 Alleo
  • @sgpbyrne - 请尝试为此使用 Pandas 模块。只需 4-5 行即可实现上述目标

标签: python csv


【解决方案1】:

这是一个使用熊猫的例子

import sys
from StringIO import StringIO
import pandas as pd

TESTDATA=StringIO("""DOB;First;Last
    2016-07-26;John;smith
    2016-07-27;Mathew;George
    2016-07-28;Aryan;Singh
    2016-07-29;Ella;Gayau
    """)

list1 = pd.read_csv(TESTDATA, sep=";")

TESTDATA=StringIO("""Date of Birth;Patient First Name;Patient Last Name
    2016-07-26;John;smith
    2016-07-27;Mathew;XXX
    2016-07-28;Aryan;Singh
    2016-07-20;Ella;Gayau
    """)


list2 = pd.read_csv(TESTDATA, sep=";")

print list2
print list1

common = pd.merge(list1, list2, how='left', left_on=['Last', 'First', 'DOB'], right_on=['Patient Last Name', 'Patient First Name', 'Date of Birth']).dropna()
print common

【讨论】:

    【解决方案2】:

    谢谢四条。

    这对我有用 - 由每个 csv 中的第一列合并。

    import csv
    from collections import OrderedDict
    
    with open('stops.csv', 'rb') as f:
        r = csv.reader(f)
        dict2 = {row[0]: row[1:] for row in r}
    
    with open('stops2.csv', 'rb') as f:
        r = csv.reader(f)
        dict1 = OrderedDict((row[0], row[1:]) for row in r)
    
    result = OrderedDict()
    for d in (dict1, dict2):
        for key, value in d.iteritems():
             result.setdefault(key, []).extend(value)
    
    with open('ab_combined.csv', 'wb') as f:
        w = csv.writer(f)
        for key, value in result.iteritems():
            w.writerow([key] + value)
    

    【讨论】:

      猜你喜欢
      • 2015-12-22
      • 1970-01-01
      • 2023-03-12
      • 2016-01-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-12
      • 1970-01-01
      相关资源
      最近更新 更多