OKここでStack Overflowのいくつかのスレッドを読みました。私はこれを行うのはかなり簡単だと思っていましたが、私はまだPythonをあまりよく把握していないことがわかりました。 共通の列の値を持つ2つのcsvファイルを組み合わせる方法ですが、両方のファイルの行数が異なる にある例を試してみましたが、それは役に立ちましたが、私は達成したい結果がまだありません。
基本的に、共通の最初の列を持つ2つのcsvファイルがあります。 2をマージしたいと思います。
filea.csv
title、stage、jan、feb darn、3.001,0.421,0.532 ok、2.829,1.036,0.751 three、1.115,1.146,2.921
fileb.csv
title、mar、apr、may、jun、 darn、0.631,1.321,0.951,1.751 ok、1.001,0.247,2.456,0.3216 three、 0.285,1.283,0.924,956
output.csv(私が得ているものではなく、私が欲しいもの)
title、stage、jan、feb、mar、apr、may、jun darn、3.001,0.421,0.532,0.631,1.321,0.951,1.751 ok、2.829,1.036 、0.751,1.001,0.247,2.456,0.3216 three、1.115,1.146,2.921,0.285,1.283,0.924,956
output.csv(実際に取得した出力)
title、feb、may ok、0.751,2.456 three、2.921,0.924 darn、0.532,0.951
私が試していたコード:
'''
testing merging of 2 csv files
'''
import csv
import array
import os
with open('Z:\\Desktop\\test\\filea.csv') as f:
r = csv.reader(f, delimiter=',')
dict1 = {row[0]: row[3] for row in r}
with open('Z:\\Desktop\\test\\fileb.csv') as f:
r = csv.reader(f, delimiter=',')
#dict2 = {row[0]: row[3] for row in r}
dict2 = {row[0:3] for row in r}
print str(dict1)
print str(dict2)
keys = set(dict1.keys() + dict2.keys())
with open('Z:\\Desktop\\test\\output.csv', 'wb') as f:
w = csv.writer(f, delimiter=',')
w.writerows([[key, dict1.get(key, "''"), dict2.get(key, "''")] for key in keys])
どんな助けも大歓迎です。
csv
ファイルを使用しているときは、 pandas ライブラリをよく使用します。このようなことが非常に簡単になります。例えば:
import pandas as pd
a = pd.read_csv("filea.csv")
b = pd.read_csv("fileb.csv")
b = b.dropna(axis=1)
merged = a.merge(b, on='title')
merged.to_csv("output.csv", index=False)
いくつかの説明が続きます。まず、csvファイルを読み込みます。
>>> a = pd.read_csv("filea.csv")
>>> b = pd.read_csv("fileb.csv")
>>> a
title stage jan feb
0 darn 3.001 0.421 0.532
1 ok 2.829 1.036 0.751
2 three 1.115 1.146 2.921
>>> b
title mar apr may jun Unnamed: 5
0 darn 0.631 1.321 0.951 1.7510 NaN
1 ok 1.001 0.247 2.456 0.3216 NaN
2 three 0.285 1.283 0.924 956.0000 NaN
そして、データの余分な列があります(fileb.csv
-title,mar,apr,may,jun,
-の最初の行には、末尾に余分なコンマがあります)。これは簡単に削除できます:
>>> b = b.dropna(axis=1)
>>> b
title mar apr may jun
0 darn 0.631 1.321 0.951 1.7510
1 ok 1.001 0.247 2.456 0.3216
2 three 0.285 1.283 0.924 956.0000
これで、タイトル列のa
とb
をマージできます。
>>> merged = a.merge(b, on='title')
>>> merged
title stage jan feb mar apr may jun
0 darn 3.001 0.421 0.532 0.631 1.321 0.951 1.7510
1 ok 2.829 1.036 0.751 1.001 0.247 2.456 0.3216
2 three 1.115 1.146 2.921 0.285 1.283 0.924 956.0000
そして最後にこれを書きます:
>>> merged.to_csv("output.csv", index=False)
生産:
title,stage,jan,feb,mar,apr,may,jun
darn,3.001,0.421,0.532,0.631,1.321,0.951,1.751
ok,2.829,1.036,0.751,1.001,0.247,2.456,0.3216
three,1.115,1.146,2.921,0.285,1.283,0.924,956.0
辞書のファイルには、1行だけでなく、すべての余分な行を保存する必要があります。
dict1 = {row[0]: row[1:] for row in r}
...
dict2 = {row[0]: row[1:] for row in r}
次に、辞書の値はリストであるため、リストを連結するだけです。
w.writerows([[key] + dict1.get(key, []) + dict2.get(key, []) for key in keys])