2013-04-28 7 views
15

ठीक है मैंने यहां स्टैक ओवरफ़्लो पर कई धागे पढ़े हैं। मैंने सोचा कि यह मेरे लिए करना काफी आसान होगा लेकिन मुझे लगता है कि मुझे अभी भी अजगर का बहुत अच्छा ज्ञान नहीं है। मैंने How to combine 2 csv files with common column value, but both files have different number of lines पर स्थित उदाहरण की कोशिश की और यह सहायक था लेकिन मेरे पास अभी भी ऐसे परिणाम नहीं हैं जिन्हें मैं प्राप्त करने की उम्मीद कर रहा था।2 सीएसवी फाइलों को विलय करना

अनिवार्य रूप से मेरे पास एक सामान्य पहले कॉलम के साथ 2 सीएसवी फाइलें हैं। मैं 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]) 

किसी भी मदद की बहुत सराहना कर रहा है।

+0

क्या आप एक सरल तरीके से जो चाहते हैं उसका वर्णन कर सकते हैं ?, शायद कुछ ऐसा कह रहा है: मैं महीने कॉलम को विलय करना चाहता हूं, फ़ाइलएक्स – juanpastas

उत्तर

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]) 
42

जब मैं 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, - अंत में एक अतिरिक्त अल्पविराम है) है देखते हैं। हम जानते हैं कि आसानी से पर्याप्त से छुटकारा पाने के कर सकते हैं:

>>> 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 

और अंत में यह लिख:

>>> 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.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 
+0

से कॉलम बाकी करें, अलग-अलग नाम कॉलम के आधार पर कोई .merge कैसे कर सकता है? जैसे। कॉलम ए पर एटेबल की तरह कॉलम बी पर बीटेबल विलय हो जाता है। –

+2

@ जॉर्ज विडिन्हा: यदि आपका कोई नया प्रश्न है, तो कृपया एक नया प्रश्न खोलें - यदि आप इसे एक वर्षीय प्रश्न पर टिप्पणी के रूप में पूछते हैं, तो कोई भी इसे नहीं देख पाएगा। – DSM

+0

सुरुचिपूर्ण समाधान, यहां तक ​​कि 4 साल बाद भी। सावधान रहें, हालांकि, '.dropna()' विधि का उपयोग किए बिना 'कैसे = "सभी" '; अन्यथा यदि कोई भी सेल खाली है तो यह कॉलम छोड़ सकता है। – WillardSolutions

संबंधित मुद्दे