30

OK、Stack Overflow でいくつかのスレッドを読みました。これはかなり簡単にできると思っていましたが、まだ Python についてよく理解していないことがわかりました。2つのcsvファイルを共通の列値と組み合わせる方法にある例を試しましたが、両方のファイルの行数が異なり、それは役に立ちましたが、達成したかった結果はまだありません.

基本的に、共通の最初の列を持つ 2 つの csv ファイルがあります。2をマージしたいと思います.ie

ファイルa.csv

タイトル、ステージ、1月、2月
くそー、3.001、0.421、0.532
わかりました、2.829、1.036、0.751
三、1.115、1.146、2.921

ファイルb.csv

タイトル,3月,4月,5月,6月,
くそー、0.631、1.321、0.951、1.751
わかりました,1.001,0.247,2.456,0.3216
3,0.285,1.283,0.924,956

output.csv (私が得ているものではなく、私が欲しいもの)

タイトル、ステージ、1月、2月、3月、4月、5月、6月
くそー、3.001、0.421、0.532、0.631、1.321、0.951、1.751
わかりました,2.829,1.036,0.751,1.001,0.247,2.456,0.3216
3,1.115,1.146,2.921,0.285,1.283,0.924,956

output.csv (実際に出力したもの)

タイトル、2月、5月
わかりました、0.751、2.456
3,2.921,0.924
くそー、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])

どんな助けでも大歓迎です。

4

2 に答える 2

91

ファイルを扱うときは、 pandasライブラリcsvをよく使用します。このようなことが非常に簡単になります。例えば:

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
于 2013-04-28T18:20:06.657 に答える