2013-06-04 12 views
6

तो मैं जो इस तरह दिखता है एनओएए से एक स्टेशन कोड csv फ़ाइल में पढ़ रहा हूँ:पांडा read_csv dtype अग्रणी शून्य

"USAF","WBAN","STATION NAME","CTRY","FIPS","STATE","CALL","LAT","LON","ELEV(.1M)","BEGIN","END" 
"006852","99999","SENT","SW","SZ","","","+46817","+010350","+14200","","" 
"007005","99999","CWOS 07005","","","","","-99999","-999999","-99999","20120127","20120127" 

पहले दो स्तंभों मौसम स्टेशनों के लिए कोड होते हैं और कभी कभी वे अग्रणी शून्य है। जब पांडा उन्हें एक प्रकार के निर्दिष्ट किए बिना आयात करता है तो वे पूर्णांक में बदल जाते हैं। यह वास्तव में एक सौदा का बड़ा नहीं है क्योंकि मैं डेटाफ्रेम इंडेक्स के माध्यम से लूप कर सकता हूं और उन्हें "%06d" % i जैसे कुछ के साथ बदल सकता हूं क्योंकि वे हमेशा छह अंक होते हैं, लेकिन आप जानते हैं ... यह आलसी मनुष्य है।

सीएसवी इस कोड का उपयोग कर प्राप्त किया जाता है:

file = urllib.urlopen(r"ftp://ftp.ncdc.noaa.gov/pub/data/inventories/ISH-HISTORY.CSV") 
output = open('Station Codes.csv','wb') 
output.write(file.read()) 
output.close() 

जो सभी अच्छी तरह से और अच्छा है, लेकिन जब मैं जाने के लिए और कोशिश करते हैं और इस का उपयोग कर इसे पढ़ें:

import pandas as pd 
df = pd.io.parsers.read_csv("Station Codes.csv",dtype={'USAF': np.str, 'WBAN': np.str}) 

या

import pandas as pd 
df = pd.io.parsers.read_csv("Station Codes.csv",dtype={'USAF': str, 'WBAN': str}) 

मुझे एक बुरा त्रुटि संदेश मिलता है:

File "C:\Python27\lib\site-packages\pandas-0.11.0-py2.7-win32.egg\pandas\io\parsers.py", line 401, in parser 
_f 
    return _read(filepath_or_buffer, kwds) 
    File "C:\Python27\lib\site-packages\pandas-0.11.0-py2.7-win32.egg\pandas\io\parsers.py", line 216, in _read 
    return parser.read() 
    File "C:\Python27\lib\site-packages\pandas-0.11.0-py2.7-win32.egg\pandas\io\parsers.py", line 633, in read 
    ret = self._engine.read(nrows) 
    File "C:\Python27\lib\site-packages\pandas-0.11.0-py2.7-win32.egg\pandas\io\parsers.py", line 957, in read 
    data = self._reader.read(nrows) 
    File "parser.pyx", line 654, in pandas._parser.TextReader.read (pandas\src\parser.c:5931) 
    File "parser.pyx", line 676, in pandas._parser.TextReader._read_low_memory (pandas\src\parser.c:6148) 
    File "parser.pyx", line 752, in pandas._parser.TextReader._read_rows (pandas\src\parser.c:6962) 
    File "parser.pyx", line 837, in pandas._parser.TextReader._convert_column_data (pandas\src\parser.c:7898) 
    File "parser.pyx", line 887, in pandas._parser.TextReader._convert_tokens (pandas\src\parser.c:8483) 
    File "parser.pyx", line 953, in pandas._parser.TextReader._convert_with_dtype (pandas\src\parser.c:9535) 
    File "parser.pyx", line 1283, in pandas._parser._to_fw_string (pandas\src\parser.c:14616) 
TypeError: data type not understood 

यह एक बहुत बड़ी सीएसवी (31k पंक्तियां) है, तो शायद इसके साथ कुछ करने के लिए कुछ है?

+0

मैंने पाया कि वस्तु का उपयोग कर अग्रणी शून्य रखने के लिए काम करता है करना होगा: dtype = {'यूएसएएफ': ऑब्जेक्ट, 'डब्ल्यूबीएएन': ऑब्जेक्ट} इस पोस्ट से: http: // stackoverflow।कॉम/प्रश्न/13293810/आयात-पांडा-डेटाफ्रेम-कॉलम-ए-स्ट्रिंग-नहीं-int –

+0

यह थोड़ा अजीब है कि str/np.str सिर्फ काम नहीं करता है ...: एसआई आश्चर्य करता है कि यह एक बग है, हो सकता है एक [github पर मुद्दा] के रूप में पोस्टिंग के लायक हो (https://github.com/pydata/pandas/issues)। –

+0

हाँ मैंने सोचा कि यह अजीब भी था क्योंकि मैं वहां अन्य नंबर डेटा प्रकारों का उपयोग कर सकता था। –

उत्तर

2

ऐसा लगता है कि आपको स्ट्रिंग की लंबाई निर्दिष्ट करना है यदि आप इसे ऑब्जेक्ट नहीं करना चाहते हैं।
उदाहरण के लिए:

dtype={'USAF': '|S6'} 

मैं इस के लिए संदर्भ नहीं मिल रहा है, लेकिन मैं (एक बात में शायद) यह बहुत ही इस मुद्दे पर चर्चा वेस को याद करने लगते हैं। उन्होंने सुझाव दिया कि numpy "उचित" परिवर्तनीय लंबाई तारों की अनुमति नहीं देता है (यह question/answer देखें), और सरणी को पॉप्युलेट करने की अधिकतम लंबाई का उपयोग करना अक्सर अविश्वसनीय रूप से अंतरिक्ष अक्षम नहीं होगा (भले ही एक स्ट्रिंग छोटा हो, सबसे लंबी स्ट्रिंग के रूप में ज्यादा जगह)।

रूप @Wes बताते हैं, यह भी एक मामला है जहां:

dtype={'USAF': object} 

काम करता है बस के रूप में अच्छी तरह से।

+2

मैं केवल '{' यूएसएएफ ': ऑब्जेक्ट} ' –

+1

@WesMcKinney उत्कृष्ट बिंदु (हमेशा के रूप में) का सुझाव दूंगा! –

5

इस समस्या ने मुझे धारावाहिक संख्याओं के साथ फ़ाइल को पार्स करते समय सभी प्रकार के सिरदर्द का कारण बना दिया। अज्ञात कारणों से 00794 और 000794 दो अलग धारावाहिक संख्याएं हैं। मैं अंत में

converters={'serial_number': lambda x: str(x)} 
+1

क्यों न केवल कन्वर्टर्स = {'serial_number' लिखें: str} '? –

+0

शायद क्योंकि मैंने इसके बारे में नहीं सोचा था :) –

+0

पांडा के लिए काम नहीं करता है == 0.20.2 –

4

के साथ आया था इस पांडा का एक मुद्दा अनुमान लगा dtype है।

पांडा संख्याएं देखता है और अनुमान आप इसे संख्याएं चाहते हैं।

पांडा अपने इरादों पर शक नहीं बनाने के लिए, आप dtype आप चाहते हैं स्थापित करना चाहिए: object

pd.read_csv('filename.csv', dtype={'leading_zero_column_name': object}) 

चाल

+0

अधिक जानकारी के लिए, 'read_csv' विधि एक [DataFrame।] देता है (http://pandas.pydata.org/ पांडा-डॉक्स/स्थिर/जेनरेट/पांडा। डेटाफ्रेम.html # पांडा। डेटाफ्रेम) और प्रत्येक फ़ील्ड के लिए डिफ़ॉल्ट अनुमानित है। 'Dtype' को स्पष्ट रूप से बताकर, परिणामी डेटाफ्रेम फ़ील्ड को सही तरीके से संभाल लेगा। – Nathan

+0

पांडा के लिए काम नहीं करता है == 0.20.2 –

+0

@DanielM क्या आप निश्चित हैं? 0.22 दावों के लिए यह दावा करना चाहिए। मैंने इसे 0.11 -> 0.14 में परीक्षण किया है, इसलिए यह अजीब होगा कि इस व्यवहार के बीच के संस्करणों में यह नहीं है ... – firelynx

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