2013-11-22 9 views
12

के साथ कॉलम की गलत संख्या की अपेक्षा करता है मेरे पास एक सीएसवी फ़ाइल है जिसमें कुछ सौ पंक्तियां और 26 कॉलम हैं, लेकिन अंतिम कुछ स्तंभों में केवल कुछ पंक्तियों में एक मान है और वे बीच की ओर हैं या वे फ़ाइल का अंत जब मैं read_csv() का उपयोग करने में इसे पढ़ने की कोशिश करता हूं तो मुझे निम्न त्रुटि मिलती है। "ValueError: 23 कॉलम की अपेक्षा, पंक्ति 64 में 26 मिली"पांडस read_csv रैग किए गए सीएसवी फ़ाइल

मैं नहीं देख सकता कि फाइल में कॉलम की संख्या स्पष्ट रूप से कहां से बताती है, या यह निर्धारित करता है कि फाइल को कितने कॉलम के बारे में सोचना चाहिए। डंप नीचे

In [3]: 

infile =open(easygui.fileopenbox(),"r") 
pledge = read_csv(infile,parse_dates='true') 


--------------------------------------------------------------------------- 
ValueError        Traceback (most recent call last) 
<ipython-input-3-b35e7a16b389> in <module>() 
     1 infile =open(easygui.fileopenbox(),"r") 
     2 
----> 3 pledge = read_csv(infile,parse_dates='true') 


C:\Python27\lib\site-packages\pandas-0.8.1-py2.7-win32.egg\pandas\io\parsers.pyc in read_csv(filepath_or_buffer, sep, dialect, header, index_col, names, skiprows, na_values, thousands, comment, parse_dates, keep_date_col, dayfirst, date_parser, nrows, iterator, chunksize, skip_footer, converters, verbose, delimiter, encoding, squeeze) 
    234   kwds['delimiter'] = sep 
    235 
--> 236  return _read(TextParser, filepath_or_buffer, kwds) 
    237 
    238 @Appender(_read_table_doc) 

C:\Python27\lib\site-packages\pandas-0.8.1-py2.7-win32.egg\pandas\io\parsers.pyc in _read(cls, filepath_or_buffer, kwds) 
    189   return parser 
    190 
--> 191  return parser.get_chunk() 
    192 
    193 @Appender(_read_csv_doc) 

C:\Python27\lib\site-packages\pandas-0.8.1-py2.7-win32.egg\pandas\io\parsers.pyc in get_chunk(self, rows) 
    779    msg = ('Expecting %d columns, got %d in row %d' % 
    780     (col_len, zip_len, row_num)) 
--> 781    raise ValueError(msg) 
    782 
    783   data = dict((k, v) for k, v in izip(self.columns, zipped_content)) 

ValueError: Expecting 23 columns, got 26 in row 64 
+0

धन्यवाद रोमन, मैं यह समझने के बीच में था कि इसे और अधिक पठनीय बनाने के लिए और आप मुझे इसे हराते हैं। :) – chrisfs

+1

एनपी, आपके प्रश्न के बारे में, क्या आपके पास अपनी फ़ाइल में हेडर है? –

+0

नहीं, कोई हेडर नहीं, ऐसा लगता है या नीचे दिया गया उत्तर जाने का तरीका होगा। – chrisfs

उत्तर

23

है आप names पैरामीटर का उपयोग कर सकते हैं। उदाहरण के लिए, अगर आप इस तरह CSV फ़ाइल है तो:

1,2,1 
2,3,4,2,3 
1,2,3,3 
1,2,3,4,5,6 

और इसे पढ़ने के लिए प्रयास करते हैं, आप प्राप्त करेंगे और त्रुटि

>>> pd.read_csv(r'D:/Temp/tt.csv') 
Traceback (most recent call last): 
... 
Expected 5 fields in line 4, saw 6 

लेकिन अगर आप names पैरामीटर भेजने, आप परिणाम मिल जाएगा:

>>> pd.read_csv(r'D:/Temp/tt.csv', names=list('abcdef')) 
    a b c d e f 
0 1 2 1 NaN NaN NaN 
1 2 3 4 2 3 NaN 
2 1 2 3 3 NaN NaN 
3 1 2 3 4 5 6 

उम्मीद है कि यह मदद करता है।

0

मान लीजिए आप इस तरह की एक फ़ाइल है:

a,b,c 
1,2,3 
1,2,3,4 

आप csv.reader का उपयोग फ़ाइल पहले साफ करने के लिए कर सकता है,

lines=list(csv.reader(open('file.csv')))  
header, values = lines[0], lines[1:]  
data = {h:v for h,v in zip (header, zip(*values))} 

और मिलती है:

{'a' : ('1','1'), 'b': ('2','2'), 'c': ('3', '3')} 

आप तो हेडर नहीं है जिसका आप उपयोग कर सकते हैं:

data = {h:v for h,v in zip (str(xrange(number_of_columns)), zip(*values))} 

और फिर आप

import pandas as pd 
df = pd.DataFrame.from_dict(data) 
+0

यदि आपके पास हेडर पंक्ति है तो आप csv.DictReader – Tjorriemorrie

4

साथ dataframe करने के लिए आप भी विभाजक के साथ '^' सीएसवी लोड कर सकते हैं एक स्तंभ के लिए पूरी स्ट्रिंग लोड करते हैं, तो तोड़ने के लिए विभाजन का उपयोग करने के शब्दकोश में बदल सकते हैं आवश्यक delimiters में स्ट्रिंग। उसके बाद, आप मूल डेटाफ्रेम (यदि आवश्यक हो) के साथ विलय करने के लिए एक संगत करते हैं।

temp=pd.read_csv('test.csv',sep='^',header=None,prefix='X') 
temp2=temp.X0.str.split(',',expand=True) 
del temp['X0'] 
temp=pd.concat([temp,temp2],axis=1) 
0

दिए गए समाधान के साथ समस्या यह है कि आपको आवश्यक कॉलम की अधिकतम संख्या जाननी है।मैं इस समस्या के लिए एक सीधा समारोह नहीं मिल सकता है, लेकिन आप निश्चित रूप से एक डीईएफ़ जो कर सकते हैं लिख सकते हैं:

  1. सभी लाइनों
  2. इसे विभाजित पढ़
  3. शब्दों की संख्या गिनती/प्रत्येक पंक्ति में तत्वों
  4. दुकान शब्द/तत्वों की अधिकतम संख्या
  5. जगह है कि नामों विकल्प (के रूप में Roman Pekar ने सुझाव दिया)

यहाँ में अधिकतम मूल्य डीई (फ़ंक्शन) मैंने अपनी फाइलों के लिए लिखा है:

def ragged_csv(filename): 
    f=open(filename) 
    max_n=0 
    for line in f.readlines(): 
     words = len(line.split(' ')) 
     if words > max_n: 
      max_n=words 
    lines=pd.read_csv(filename,sep=' ',names=range(max_n)) 
    return lines 
+0

का उपयोग कर सकते हैं मेरे विशेष मामले में, मुझे कॉलम की अधिकतम संख्या पता था, लेकिन यदि आप बाहरी डेटा का उपयोग कर रहे हैं तो यह उपयोगी हो सकता है, जहां यह तुरंत उपलब्ध नहीं है। – chrisfs

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