2013-08-27 11 views
6

मेरे पास एक कॉलम के साथ एक टैब अलग फ़ाइल है जिसे स्ट्रिंग के रूप में व्याख्या किया जाना चाहिए, लेकिन कई प्रविष्टियां पूर्णांक हैं। साथ छोटे फ़ाइलों read_csv सही ढंग से कुछ गैर पूर्णांक मूल्यों को देखने के बाद एक स्ट्रिंग के रूप स्तंभ की व्याख्या है, लेकिन बड़ी फ़ाइलों, यह does not काम के साथ:पांडा read_csv dtype अनुमान समस्या

import pandas as pd 
df = pd.DataFrame({'a':['1']*100000 + ['X']*100000 + ['1']*100000, 'b':['b']*300000}) 
df.to_csv('test', sep='\t', index=False, na_rep='NA') 
df2 = pd.read_csv('test', sep='\t') 
print df2['a'].unique() 
for a in df2['a'][262140:262150]: 
    print repr(a) 

उत्पादन:

['1' 'X' 1] 
'1' 
'1' 
'1' 
'1' 
1 
1 
1 
1 
1 
1 

दिलचस्प बात यह है 262,144 2 के एक शक्ति है तो मुझे लगता है कि अनुमानों में रूपांतरण और रूपांतरण हो रहा है लेकिन कुछ हिस्सों को छोड़ रहा है।

मैं काफी कुछ यह एक बग है, लेकिन उस के चारों ओर एक काम शायद हवाले से उपयोग करता चाहते हैं रहा हूँ, हालांकि के हवाले = csv.QUOTE_NONNUMERIC पढ़ने और लिखने के लिए समस्या हल नहीं होती जोड़ने। आदर्श रूप से मैं अपने स्ट्रिंग डेटा को उद्धृत करके इस बारे में काम कर सकता हूं और किसी भी तरह उद्धृत डेटा पर कोई अनुमान नहीं करने के लिए पांडा को मजबूर कर सकता हूं।

का उपयोग करते हुए पांडा 0.12.0

+2

[डॉक्स] (http://pandas.pydata.org/pandas-docs/stable/generated/pandas.io.parsers.read_csv.html) ऐसा लगता है कि यह काम करेगा: 'pd.read_csv (' परीक्षण ', sep =' \ t ', कन्वर्टर्स = {' ए ': str}) '। –

+0

@StevenRumbalski और यह पूरी तरह से करता है! आपको इसे एक उत्तर के रूप में जोड़ना चाहिए! –

+0

@ एंडीहेडन: धन्यवाद - किया गया। –

उत्तर

5

आप read_csv पार्सर यहाँ धोखा दिया है (और निष्पक्ष होना करने के लिए, मुझे नहीं लगता कि सही ढंग से कोई बात नहीं क्या आप इसे फेंक यह हमेशा उत्पादन की उम्मीद की जा सकती है) ... लेकिन हाँ, यह a bug हो सकता है!

रूप @Steven बताते हैं आप read_csv की कन्वर्टर्स तर्क का उपयोग कर सकते हैं: इस पैच करने के लिए

df2 = pd.read_csv('test', sep='\t', converters={'a': str}) 

एक आलसी समाधान सिर्फ है के बाद आप फ़ाइल में पढ़ा है:

In [11]: df2['a'] = df2['a'].astype('str') 

# now they are equal 
In [12]: pd.util.testing.assert_frame_equal(df, df2) 

नोट: यदि आप को डेटाफ्रेम स्टोर करने का समाधान ढूंढ रहे हैं, उदाहरण के लिए सत्रों के बीच, दोनों अचार और एचडीएफ 5 स्टोयर उत्कृष्ट समाधान हैं जो इन प्रकार की पार्सिंग बग से प्रभावित नहीं होंगे (और काफी तेजी से होंगे)। देखें: How to store data frame using PANDAS, Python

+0

यह मेरी फॉलबैक है, लेकिन जब भी मैं – andrew

+0

से बचने की कोशिश कर रहा था, तो फ़ाइल की अतिरिक्त पंक्तियां शामिल होती हैं, तो शायद आपको डेटाफ्रेम, to_pickle या hdf5_store स्टोर करने के लिए to_csv/read_csv का उपयोग नहीं करना है, और न ही बेहतर समाधान होंगे इस तरह की पार्सिंग बग से प्रभावित)। –

+0

@ user1068490 –

6

पांडा अपने डेटा प्रकार का अनुमान लगा होने से बचने के लिए, read_csv करने के लिए एक converters तर्क प्रदान करते हैं:

converters: dict। वैकल्पिक

कुछ स्तंभों में मूल्यों को परिवर्तित करने के लिए कार्यों का डिक्ट।

df2 = pd.read_csv('test', sep='\t', converters={'a':str}) 

किए गए दस्तावेज़ों की मेरी पठन कि आप प्रत्येक कॉलम में कन्वर्टर्स निर्दिष्ट करने की आवश्यकता नहीं है: कुंजी या तो पूर्णांक या स्तंभ लेबल

अपनी फ़ाइल के लिए इस प्रकार दिखाई देगा हो सकता है। पांडों को अनिर्दिष्ट कॉलम के डेटाटाइप का अनुमान लगाना जारी रखना चाहिए।

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