मैं कैसे एक रिकॉर्ड सरणी में CSV डेटा को CSPy में पढ़ सकता हूं?


414

मुझे आश्चर्य है कि ज्यादा रास्ते में एक रिकॉर्ड सरणी में एक CSV फ़ाइल की सामग्री आयात करने के लिए एक सीधा रास्ता नहीं है, तो वह आर के read.table(), read.delim()और read.csv()आर के डेटा फ्रेम करने के लिए परिवार के आयात डेटा?

या csv.reader () का उपयोग करने का सबसे अच्छा तरीका है और फिर कुछ लागू करना है numpy.core.records.fromrecords()?


जवाबों:


645

आप genfromtxt()ऐसा करने के लिए, delimiterकॉम्प्लेक्स को अल्पविराम में सेट करके ऐसा करने के लिए Numpy की विधि का उपयोग कर सकते हैं ।

from numpy import genfromtxt
my_data = genfromtxt('my_file.csv', delimiter=',')

फ़ंक्शन के बारे में अधिक जानकारी इसके संबंधित प्रलेखन में पाई जा सकती है ।


10
यदि आप विभिन्न प्रकार के कुछ चाहते हैं तो क्या होगा? तार और स्याही की तरह?
CGTheLegend

11
@CGTheLegend np.genfromtxt ('myfile.csv', delimiter = ',', dtype = none)
मुर्गियां

2
numpy.loadtxt ने मेरे लिए भी बहुत अच्छा काम किया
यिबो यांग

10
मैंने यह कोशिश की लेकिन मुझे केवल nanमूल्य मिल रहे हैं, क्यों? साथ ही लोडटैक्स के साथ, मुझे मिल रहा है UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 155: ordinal not in range(128)। मेरे पास इनपुट डेटा में umlauts जैसे ä और ö हैं।
hhh

1
@hh encoding="utf8"तर्क जोड़ने का प्रयास करें । पायथन कुछ आधुनिक सॉफ्टवेयर टुकड़ों में से एक है जो अक्सर पाठ एन्कोडिंग समस्याओं का कारण बनता है, जो अतीत की चीजों के रूप में महसूस करते हैं।
कोल्ड

187

मैं पुस्तकालय read_csvसे समारोह की सिफारिश करूंगा pandas:

import pandas as pd
df=pd.read_csv('myfile.csv', sep=',',header=None)
df.values
array([[ 1. ,  2. ,  3. ],
       [ 4. ,  5.5,  6. ]])

यह एक पांडा डेटाफ़्रेम देता है - कई उपयोगी डेटा हेरफेर कार्यों की अनुमति देता है जो सीधे संख्यात्मक रिकॉर्ड सरणियों के साथ उपलब्ध नहीं हैं

DataFrame संभावित विभिन्न प्रकार के स्तंभों के साथ एक 2-आयामी लेबल डेटा संरचना है। आप इसे स्प्रैडशीट या SQL टेबल की तरह सोच सकते हैं ...


मैं भी सिफारिश करूंगा genfromtxt। हालांकि, चूंकि प्रश्न एक रिकॉर्ड सरणी के लिए पूछता है , एक सामान्य सरणी के विपरीत, dtype=Noneपैरामीटर को genfromtxtकॉल में जोड़ा जाना चाहिए :

इनपुट फ़ाइल दी गई myfile.csv:

1.0, 2, 3
4, 5.5, 6

import numpy as np
np.genfromtxt('myfile.csv',delimiter=',')

एक सरणी देता है:

array([[ 1. ,  2. ,  3. ],
       [ 4. ,  5.5,  6. ]])

तथा

np.genfromtxt('myfile.csv',delimiter=',',dtype=None)

एक रिकॉर्ड सरणी देता है:

array([(1.0, 2.0, 3), (4.0, 5.5, 6)], 
      dtype=[('f0', '<f8'), ('f1', '<f8'), ('f2', '<i4')])

इसका लाभ यह है कि कई डेटा प्रकारों (तार सहित) के साथ फ़ाइल आसानी से आयात की जा सकती है


read_csv कोट्स के अंदर कॉमा के साथ काम करता है। इस पर genfromtxt सिफारिश
वियतनामी

3
मानों में पहली पंक्ति को छोड़ने के लिए हेडर = 0 का उपयोग करें, अगर आपकी फ़ाइल में 1-लाइन हेडर है
c-chavez

ध्यान रखें कि यह एक 2d सरणी बनाता है: उदा (1000, 1)np.genfromtxtऐसा नहीं करता है: जैसे (1000,)
न्यूस्कूलर

74

मैंने टाइम किया

from numpy import genfromtxt
genfromtxt(fname = dest_file, dtype = (<whatever options>))

बनाम

import csv
import numpy as np
with open(dest_file,'r') as dest_f:
    data_iter = csv.reader(dest_f,
                           delimiter = delimiter,
                           quotechar = '"')
    data = [data for data in data_iter]
data_array = np.asarray(data, dtype = <whatever options>)

लगभग 70 स्तंभों के साथ 4.6 मिलियन पंक्तियों पर और पाया कि NumPy पथ ने 2 मिनट 16 सेकंड और csv- सूची समझ की विधि 13 सेकंड ली।

मैं csv- सूची समझने की विधि की सिफारिश करूंगा क्योंकि यह सबसे अधिक संभावना पूर्व संकलित पुस्तकालयों पर निर्भर करता है और दुभाषिया के रूप में ज्यादा नहीं। मुझे संदेह है कि पांडा विधि में दुभाषिया ओवरहेड समान होगा।


23
मैंने इस तरह के एक कोड का परीक्षण एक सीएसवी फ़ाइल के साथ किया जिसमें 2.6 मिलियन पंक्तियाँ और 8 कॉलम थे। numpy.recfromcsv () में लगभग 45 सेकंड लगे, np.asarray (सूची (csv.reader ())) में लगभग 7 सेकंड लगे, और pandas.read_csv () में लगभग 2 सेकंड (!) लगे। (फ़ाइल को हाल ही में सभी मामलों में डिस्क से पढ़ा गया था, इसलिए यह पहले से ही ऑपरेटिंग सिस्टम की फ़ाइल कैश में था।) मुझे लगता है कि मैं पांडा के साथ जाऊंगा।
मथियास फ्रेंप

5
मैंने अभी देखा कि wesmckinney.com/blog/ ... पर पांडा के तेज सीएसवी पार्सर के डिजाइन के बारे में कुछ नोट हैं । लेखक गति और स्मृति आवश्यकताओं को बहुत गंभीरता से लेता है। यह भी संभव है as_recarray = पंडों के डेटाफ़्रेम के बजाय सीधे पायथन रिकॉर्ड सरणी के रूप में परिणाम प्राप्त करने के लिए सही।
Matthias Fripp

67

आप यह भी कोशिश कर सकते हैं recfromcsv()जो डेटा प्रकारों का अनुमान लगा सकते हैं और एक उचित स्वरूपित रिकॉर्ड सरणी वापस कर सकते हैं।


9
यदि आप CSV में ऑर्डरिंग / कॉलम नामों को बनाए रखना चाहते हैं, तो आप निम्न मंगलाचरण का उपयोग कर सकते हैं: numpy.recfromcsv(fname, delimiter=',', filling_values=numpy.nan, case_sensitive=True, deletechars='', replace_space=' ')प्रमुख तर्क अंतिम तीन हैं।
14

16

जैसा कि मैंने NumPy और Pandas का उपयोग करके दोनों तरीकों की कोशिश की, पांडा के उपयोग से बहुत सारे फायदे हैं:

  • और तेज
  • कम CPU उपयोग
  • NumPy genfromtxt की तुलना में 1/3 RAM का उपयोग

यह मेरा परीक्षण कोड है:

$ for f in test_pandas.py test_numpy_csv.py ; do  /usr/bin/time python $f; done
2.94user 0.41system 0:03.05elapsed 109%CPU (0avgtext+0avgdata 502068maxresident)k
0inputs+24outputs (0major+107147minor)pagefaults 0swaps

23.29user 0.72system 0:23.72elapsed 101%CPU (0avgtext+0avgdata 1680888maxresident)k
0inputs+0outputs (0major+416145minor)pagefaults 0swaps

test_numpy_csv.py

from numpy import genfromtxt
train = genfromtxt('/home/hvn/me/notebook/train.csv', delimiter=',')

test_pandas.py

from pandas import read_csv
df = read_csv('/home/hvn/me/notebook/train.csv')

डेटा फ़ाइल:

du -h ~/me/notebook/train.csv
 59M    /home/hvn/me/notebook/train.csv

संस्करणों में NumPy और पांडा के साथ:

$ pip freeze | egrep -i 'pandas|numpy'
numpy==1.13.3
pandas==0.20.2

5

आप इस कोड का उपयोग CSV फ़ाइल डेटा को एक सरणी में भेजने के लिए कर सकते हैं:

import numpy as np
csv = np.genfromtxt('test.csv', delimiter=",")
print(csv)

4

का उपयोग करते हुए numpy.loadtxt

एक काफी सरल विधि। लेकिन इसमें सभी तत्वों के तैरने की आवश्यकता होती है (इंट वगैरह)

import numpy as np 
data = np.loadtxt('c:\\1.csv',delimiter=',',skiprows=0)  

4

यह सबसे आसान तरीका है:

import csv with open('testfile.csv', newline='') as csvfile: data = list(csv.reader(csvfile))

अब डेटा में प्रत्येक प्रविष्टि एक रिकॉर्ड है, जिसे एक सरणी के रूप में दर्शाया गया है। तो आप एक 2 डी सरणी है। इसने मेरा बहुत समय बचा लिया।


जब पंडों के पास इतना कम फ़ीचर ब्लोट होता है, तो हमें पंडों के साथ चक्कर क्यों लगाना चाहिए?
क्रिस्टोफर

3

मैंने यह कोशिश की:

import pandas as p
import numpy as n

closingValue = p.read_csv("<FILENAME>", usecols=[4], dtype=float)
print(closingValue)

3

मैं तालिकाओं ( pip3 install tables) का उपयोग करने का सुझाव दूंगा । आप पांडा ( ) का उपयोग करके अपनी .csvफ़ाइल को सहेज सकते हैं ,.h5pip3 install pandas

import pandas as pd
data = pd.read_csv("dataset.csv")
store = pd.HDFStore('dataset.h5')
store['mydata'] = data
store.close()

फिर आप आसानी से और कम समय के लिए भी बड़ी मात्रा में डेटा के लिए अपने डेटा को एक NumPy सरणी में लोड कर सकते हैं ।

import pandas as pd
store = pd.HDFStore('dataset.h5')
data = store['mydata']
store.close()

# Data in NumPy format
data = data.values

3

एक आकर्षण के रूप में यह काम ...

import csv
with open("data.csv", 'r') as f:
    data = list(csv.reader(f, delimiter=";"))

import numpy as np
data = np.array(data, dtype=np.float)

कोड को अपने कोड मार्कडाउन लेआउट के अंदर ठीक से इंडेंट करना होगा।
surajs1n
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.