2013-03-06 5 views
43

मैं किसी डेटा सेट है कि इस तरह दिखता है (सबसे 5 कॉलम में - लेकिन कम किया जा सकता है)चर पांडा के साथ स्तंभों की संख्या का रखरखाव करना - अजगर

1,2,3 
1,2,3,4 
1,2,3,4,5 
1,2 
1,2,3,4 
.... 

मैं पांडा उपयोग करने के लिए कोशिश कर रहा हूँ में इस पढ़ने के लिए read_table एक 5 कॉलम डेटा फ्रेम। मैं बिना अतिरिक्त मालिश के इसे पढ़ना चाहता हूं।

अगर मैं

import pandas as pd 
my_cols=['A','B','C','D','E'] 
my_df=pd.read_table(path,sep=',',header=None,names=my_cols) 

कोशिश मैं कोई त्रुटि मिलती है - "स्तंभ नाम 5 क्षेत्रों, डेटा 3 फ़ील्ड होते हैं।"

क्या डेटा पढ़ने के दौरान गायब कॉलम के लिए पांडा को NaN में भरने का कोई तरीका है?

उत्तर

50

एक दूसरी तरह से काम करने के लिए (कम से कम 0.10.1 में और 0.11.0.dev-fc8de6d) लगता है:

>>> !cat ragged.csv 
1,2,3 
1,2,3,4 
1,2,3,4,5 
1,2 
1,2,3,4 
>>> my_cols = ["A", "B", "C", "D", "E"] 
>>> pd.read_csv("ragged.csv", names=my_cols, engine='python') 
    A B C D E 
0 1 2 3 NaN NaN 
1 1 2 3 4 NaN 
2 1 2 3 4 5 
3 1 2 NaN NaN NaN 
4 1 2 3 4 NaN 

नोट इस दृष्टिकोण है कि आप स्तंभों के नाम दे आवश्यकता है कि आप हालांकि, चाहते हैं। कुछ अन्य तरीकों के रूप में सामान्य नहीं है, लेकिन यह लागू होने पर काफी अच्छी तरह से काम करता है।

+2

धन्यवाद! यह काम किया - इंजन = 'पायथन' कुंजी प्रतीत होता है। इस विशेषता को जोड़ना read_table और read_csv दोनों काम करता है। –

+2

यह मेरे लिए बहुत सुंदर लगता है। एक जिथब मुद्दा जोड़ना: https://github.com/pydata/pandas/issues/2981 –

+9

यह सही ढंग से काम करता है बिना बीटीडब्ल्यू 'इंजन =' पायथन ' –

8

मुझे यह जानने में भी दिलचस्पी होगी कि यह संभव है, डॉक्टर द्वारा यह मामला प्रतीत नहीं होता है। क्या आप संभवत: लाइन द्वारा फ़ाइल लाइन पढ़ा जाता है सकते हैं, और एक DataFrame करने के लिए प्रत्येक पढ़ने श्रेणीबद्ध:

import pandas as pd 

df = pd.DataFrame() 

with open(filepath, 'r') as f: 
    for line in f: 
     df = pd.concat([df, pd.DataFrame([tuple(line.strip().split(','))])], ignore_index=True) 

यह काम करता है, लेकिन नहीं सबसे खूबसूरत तरीके से, मुझे लगता है कि ...

1

ठीक है। यह सुनिश्चित नहीं है कि यह कितना कुशल है - लेकिन यहां मैंने जो किया है। यह सुनना अच्छा लगेगा कि ऐसा करने का एक बेहतर तरीका है या नहीं। धन्यवाद !

from pandas import DataFrame 

list_of_dicts=[] 
labels=['A','B','C','D','E'] 
for line in file: 
    line=line.rstrip('\n') 
    list_of_dicts.append(dict(zip(labels,line.split(',')))) 
frame=DataFrame(list_of_dicts) 
संबंधित मुद्दे