मौजूदा सीएसवी फ़ाइल में पांडा डेटा कैसे जोड़ें?


259

मैं जानना चाहता हूं कि क्या to_csv()किसी मौजूदा सीएसवी फाइल में डेटाफ्रेम जोड़ने के लिए पांडा फ़ंक्शन का उपयोग करना संभव है । सीएसवी फ़ाइल में लोड किए गए डेटा के समान संरचना है।


6
मुझे लगता है कि @tlingf द्वारा सुझाई गई विधि केवल इसलिए बेहतर है क्योंकि वह पांडा लाइब्रेरी की बिल्ड-इन कार्यक्षमता का उपयोग कर रही है। वह "a" के रूप में परिभाषित मोड का सुझाव देता है। "A" का अर्थ है APPEND 'df.to_csv (' my_csv.csv ', मोड =' a ', हैडर = गलत)'
Ayrat

1
@KCzar से जवाब दोनों मामलों पर विचार करता है जब CSV फ़ाइल नहीं होती है (यानी स्तंभ शीर्ष लेख जोड़ें) और जब CSV पहले से ही है (इसलिए हेडर के बिना सिर्फ डेटा पंक्तियाँ जोड़ें)। किसी भी स्थिति में यह "एपेंड" मोड और एक कस्टम विभाजक का उपयोग करता है, साथ ही कॉलम की संख्या पर जांच करता है।
TPPZ

जवाबों:


542

आप पांडा to_csvफ़ंक्शन में एक पायथन लेखन मोड निर्दिष्ट कर सकते हैं । परिशिष्ट के लिए यह 'क' है।

आपके मामले में:

df.to_csv('my_csv.csv', mode='a', header=False)

डिफ़ॉल्ट मोड 'w' है।


7
जवाब के लिए धन्यवाद। यह मुझे पंक्ति-वार पर नए डीएफ को जोड़ने की अनुमति देगा। लेकिन क्या आप मुझे बता सकते हैं कि मैं कॉलम-वार पर नए डीएफ को कैसे जोड़ सकता हूं?
डेटान्यू

मैं 'my_csv.csv' को फिर से पढ़कर इसे पूरा करने में सक्षम था, फिर नए df को सम्‍मिलित करूंगा, और फिर इसे सहेजूंगा। यदि आप कुछ आसान विधि जानते हैं, तो कृपया मुझे बताएं। मैं सराहना करता हूं!
21

2
पहली फ़ाइल के लिए हेडर कैसे लिखें और बाकी पंक्तियाँ अपने आप जुड़ जाती हैं?
इतिशा

4
@ इतिशा कुछ इस तरह हैdf.to_csv(output_path, mode='a', header=not os.path.exists(output_path))
मिशेल टोनुट्टी

255

आप कर सकते हैं संलग्न द्वारा एक csv करने के लिए फ़ाइल खोलने संलग्न मोड में:

with open('my_csv.csv', 'a') as f:
    df.to_csv(f, header=False)

यदि यह आपका सीएसवी था foo.csv,:

,A,B,C
0,1,2,3
1,4,5,6

यदि आप इसे पढ़ते हैं और फिर संलग्न करते हैं, उदाहरण के लिए df + 6:

In [1]: df = pd.read_csv('foo.csv', index_col=0)

In [2]: df
Out[2]:
   A  B  C
0  1  2  3
1  4  5  6

In [3]: df + 6
Out[3]:
    A   B   C
0   7   8   9
1  10  11  12

In [4]: with open('foo.csv', 'a') as f:
             (df + 6).to_csv(f, header=False)

foo.csv हो जाता है:

,A,B,C
0,1,2,3
1,4,5,6
0,7,8,9
1,10,11,12

50
with open(filename, 'a') as f:
    df.to_csv(f, header=f.tell()==0)
  • जब तक मौजूद न हो, फ़ाइल बनाएँ, अन्यथा संलग्न करें
  • यदि फ़ाइल बनाई जा रही है तो हेडर जोड़ें, अन्यथा उसे छोड़ दें

2
यह mode='a'एक पैरामीटर के रूप में गायब है to_csv(यानीdf.to_csv(f, mode='a', header=f.tell()==0)
गैब्रिएला मेलो

2
@ गैब्रिएलामेलो जो खुले (फ़ाइल नाम, 'क') में पारित किया गया था।
पीयूष

21

थोड़ा हेल्पर फंक्शन जो मैं कुछ हेडर के साथ उपयोग करता हूँ जो यह सब संभालने के लिए सुरक्षा उपायों की जाँच करता है:

def appendDFToCSV_void(df, csvFilePath, sep=","):
    import os
    if not os.path.isfile(csvFilePath):
        df.to_csv(csvFilePath, mode='a', index=False, sep=sep)
    elif len(df.columns) != len(pd.read_csv(csvFilePath, nrows=1, sep=sep).columns):
        raise Exception("Columns do not match!! Dataframe has " + str(len(df.columns)) + " columns. CSV file has " + str(len(pd.read_csv(csvFilePath, nrows=1, sep=sep).columns)) + " columns.")
    elif not (df.columns == pd.read_csv(csvFilePath, nrows=1, sep=sep).columns).all():
        raise Exception("Columns and column order of dataframe and csv file do not match!!")
    else:
        df.to_csv(csvFilePath, mode='a', index=False, sep=sep, header=False)

1
यदि स्तंभ आदेश मेल नहीं खाता है तो हम क्या कर सकते हैं?
जेसन गोल

@ जैसनहाउस डीएफ = डीएफ.रेइंडेक्स (छांटे गए (डीएफ. कॉलम), अक्ष = 1); stackoverflow.com/a/11067072/9095840 देखें ।
मार्केसम

4

शुरू में एक pyspark डेटाफ्रेम के साथ शुरू - मुझे टाइप कन्वर्सेशन एरर मिला (जब pandas df में बदलना और फिर csv में अप्लाई करना) मेरे pyspark डेटाफ्रेम में स्कीमा / कॉलम प्रकार दिए गए

प्रत्येक df में सभी स्तंभों को टाइप स्ट्रिंग के लिए बाध्य करके समस्या को हल किया और फिर इसे csv में निम्नानुसार जोड़ा:

with open('testAppend.csv', 'a') as f:
    df2.toPandas().astype(str).to_csv(f, header=False)

3

पार्टी में थोड़ा देर से लेकिन आप एक संदर्भ प्रबंधक का उपयोग भी कर सकते हैं, यदि आप अपनी फ़ाइल को कई बार खोल रहे हैं या बंद कर रहे हैं, या डेटा, आँकड़े आदि लॉग कर रहे हैं।

from contextlib import contextmanager
import pandas as pd
@contextmanager
def open_file(path, mode):
     file_to=open(path,mode)
     yield file_to
     file_to.close()


##later
saved_df=pd.DataFrame(data)
with open_file('yourcsv.csv','r') as infile:
      saved_df.to_csv('yourcsv.csv',mode='a',header=False)`
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.