Нужно объединить два файла Excel по идентификатору в один файл Excel, используя Python 2.7
Я новичок в семействе Python и уже несколько дней пытаюсь решить проблему слияния двух файлов Excel. Я бесконечно исследовал слияние и пытался адаптировать свой код под свои нужды, но он не работал. Мне было интересно, могу ли я получить какую-либо помощь, почему мой код не работает. Я чувствую, что это может быть общей проблемой для других, использующих Python, так что, надеюсь, это поможет и другим. Я ценю любые комментарии!
У меня есть два файла Excel, "Китайский Scores3.csv" и "Китайский Scores4.csv", которые я пытаюсь объединить по идентификатору, который уникален для каждой компании. Кроме идентификатора компании, нет соответствующих столбцов для каждого файла Excel. Кроме того, не все компании перечислены в обоих файлах. Некоторые из них перечислены в обоих, но другие перечислены в одном или другом. Я хотел бы приложить всю информацию для идентификатора компании вместе в одну строку на листе Excel. первые столбцы файла Excel - это ID, JanSales, FebSales и т. д., а вторые столбцы файла Excel - это ID, CreditScore, EMMAScore и т. д. В файле Excel, который я хотел бы создать, есть столбцы: ID, JanSales, FebSales, CreditScore, EMMAScore. все в соответствии с идентификатором компании.
Это имеет смысл? Это похоже на использование VLOOKUP в Excel, но я хотел бы сделать это с помощью 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:]) )
1 ответ
Хотя мы могли бы исправить ваш код, я настоятельно рекомендую заглянуть в библиотеку 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")