1

我是 Python 家族的新手,几天来一直在尝试解决合并两个 Excel 文件的问题。我无休止地研究了合并,并试图调整我的代码以满足我的需求,但它一直没有奏效。我想知道我是否可以就我的代码为什么不工作获得任何帮助。我觉得这可能是其他使用 Python 的人的常见问题,所以希望这也能帮助其他人。我很感激任何评论!

我有两个 Excel 文件,“Chinese Scores3.csv”和“Chinese Scores4.csv”,我试图通过一个 ID 合并它们,每个公司都是唯一的。除了公司 ID,每个 Excel 文件都没有匹配的列。此外,并非所有公司都列在这两个文件中。有些列出了两者,但其他列出了一个或另一个。我想将公司 ID 的所有信息一起附加到 Excel 表上的一行中。即第一个excel文件列是ID、JanSales、FebSales等,第二个excel文件列是ID、CreditScore、EMMAScore等。我要创建的excel文件有列:ID、JanSales、FebSales、CreditScore、EMMAScore全部根据公司ID。

这有意义吗?这就像在 excel 中使用 VLOOKUP,但我想使用 Python 来做到这一点。无论如何,这是我的编码,它不起作用。我尝试操纵它,但它不起作用。我希望得到反馈!

import sys
import csv

def main(arg):
    headers= []

    for arg in 'Chinese Scores3.csv':
        with open(arg) as f:
            curr = 'Chinese Scores3.csv'.reader(f).next()
            headers.append(curr)
            try:
                keys=list( set(keys) & set (curr))
            except NameError:
                keys = curr


    header = list(keys)
    for h in headers:
        header += [ k for k in h if k not in keys ]

    data = {}
    for arg in 'Chinese Scores4.csv':
        with open(arg) as f:
            reader = 'Chinese Scores4.csv'.DictReader(f)
            for line in reader:
                data_key = tuple([ line[k] for k in keys ])
                if not data_key in data: data[data_key] = {}
                for k in header:
                    try:
                        data[data_key][k] = line[k]
                    except KeyError:
                        pass

    for key in data.keys():
        for col in header:
            if key in data and not col in data[key]:
                del( data[key] )

    print ','.join(header)
    for key in sorted(data):
        row = [ data[key][col] for col in header ]
        print ','.join(row)

if __name__ == '__main__':
    sys.exit( main( sys.argv[1:]) )
4

1 回答 1

2

虽然我们可以修复您的代码,但如果您要进行此类工作,我强烈建议您查看pandas库。它使生活变得更轻松,而且通常微不足道。

例如,如果我们有两个 csv 文件(尽管如果需要,我们可以直接从 Excel 文件开始):

>>> !cat scores3.csv
ID,JanSales,FebSales
1,100,200
2,200,500
3,300,400
>>> !cat scores4.csv
ID,CreditScore,EMMAScore
2,good,Watson
3,okay,Thompson
4,not-so-good,NA

我们可以将它们读入称为 DataFrames 的对象中(将它们想象成 Excel 表格):

>>> import pandas as pd
>>> s3 = pd.read_csv("scores3.csv")
>>> s4 = pd.read_csv("scores4.csv")
>>> s3
   ID  JanSales  FebSales
0   1       100       200
1   2       200       500
2   3       300       400
>>> s4
   ID  CreditScore EMMAScore
0   2         good    Watson
1   3         okay  Thompson
2   4  not-so-good       NaN

然后我们可以在 ID 列上合并它们:

>>> merged = s3.merge(s4, on="ID", how="outer")
>>> merged
   ID  JanSales  FebSales  CreditScore EMMAScore
0   1       100       200          NaN       NaN
1   2       200       500         good    Watson
2   3       300       400         okay  Thompson
3   4       NaN       NaN  not-so-good       NaN

之后我们可以将其保存到 csv 文件或 Excel 文件中:

>>> merged.to_csv("merged.csv")
>>> merged.to_excel("merged.xlsx")
于 2013-07-15T19:18:23.720 回答