2013-06-13 6 views
15

मेरे पास pandas.DataFrame है जो मैं एक CSV फ़ाइल में निर्यात करना चाहता हूं। हालांकि, पांडा int प्रकारों के बजाय float के रूप में कुछ मान लिखते हैं। मुझे यह व्यवहार नहीं बदला जा सका।पायथन पांडा: पूर्णांक के साथ आउटपुट डेटाफ्रेम सीएसवी

एक डेटा फ्रेम का निर्माण:

df = pandas.DataFrame(columns=['a','b','c','d'], index=['x','y','z'], dtype=int) 
x = pandas.Series([10,10,10], index=['a','b','d'], dtype=int) 
y = pandas.Series([1,5,2,3], index=['a','b','c','d'], dtype=int) 
z = pandas.Series([1,2,3,4], index=['a','b','c','d'], dtype=int) 
df.loc['x']=x; df.loc['y']=y; df.loc['z']=z 

देखें यह:

>>> df 
    a b c d 
x 10 10 NaN 10 
y 1 5 2 3 
z 1 2 3 4 

निर्यात यह:

>>> df.to_csv('test.csv', sep='\t', na_rep='0', dtype=int) 
>>> for l in open('test.csv'): print l.strip('\n') 
     a  b  c  d 
x  10.0 10.0 0  10.0 
y  1  5  2  3 
z  1  2  3  4 

क्यों दसियों एक डॉट शून्य है?

ज़रूर, मैं तो बस इस समारोह मेरी पाइपलाइन में पूरी CSV फ़ाइल reconvert से चिपक सकता है, लेकिन यह अनावश्यक लगता है:

def lines_as_integer(path): 
    handle = open(path) 
    yield handle.next() 
    for line in handle: 
     line = line.split() 
     label = line[0] 
     values = map(float, line[1:]) 
     values = map(int, values) 
     yield label + '\t' + '\t'.join(map(str,values)) + '\n' 
handle = open(path_table_int, 'w') 
handle.writelines(lines_as_integer(path_table_float)) 
handle.close() 
+2

आप pd' :) –

+3

के रूप में 'आयात पांडा @Andy क्यों मुझे लगता है कि क्या करना चाहिए करना चाहिए: यह क्या संदर्भ के लिए अंत में मेरी समस्या हल है? नेमस्पेस एक अच्छा विचार है ... जब तक आप उन्हें संक्षिप्त नहीं करते हैं और यह अपठनीय हो जाता है। – xApple

+0

यह मानक है, इसी तरह numpy एनपी है (और पीडी.एनपी के रूप में उपलब्ध)। पांडा पीडी से काफी लंबा है, हर बार इसे लिखने से कोड * कम * पठनीय आईएमओ होगा। –

उत्तर

8

की आवश्यकता नहीं होगी के रूप में इस सवाल का जवाब मैं खोज रहा था की एक मामूली बदलाव था @Jeff ने अपने जवाब में क्या प्रस्तावित किया। क्रेडिट उसके पास जाता है।

import pandas 
    df = pandas.DataFrame(data, columns=['a','b','c','d'], index=['x','y','z']) 
    df = df.fillna(0) 
    df = df.astype(int) 
    df.to_csv('test.csv', sep='\t') 
+2

यह किसी भी फ्लोट के आसपास हो जाता है लेकिन आप NaN जानकारी खो देते हैं। शायद एनए 99 99 के साथ भरें या कुछ मूल्य जो आप जानते हैं वह आपके डेटा सेट में 'वास्तविक' नहीं है। – Cyrille

8

यह एक "gotcha" in pandas (Support for integer NA), जहां Nans साथ पूर्णांक कॉलम तैरता में बदल दिए जाते है।

यह व्यापार-बंद स्मृति और प्रदर्शन कारणों के लिए काफी हद तक बनाया गया है, और यह भी कि परिणामी श्रृंखला "संख्यात्मक" है। एक संभावना है कि इसके बजाय dtype=object सरणी का उपयोग करें।

+0

तो पूरी फ़ाइल को दोबारा किए बिना उन्हें पूर्णांक के रूप में प्राप्त करने का कोई तरीका नहीं है? अगर मैं 'df.fillna()' का उपयोग करता हूं तो कैसे? – xApple

+2

'x' और' df' बनाते समय 'dtype = object' (' int' के बजाय) का उपयोग करें। –

7

समस्या यह है कि जब से तुम पंक्तियों से बातें बताए हैं, लेकिन dtypes, कॉलम के आधार पर वर्गीकृत किया जाता है ताकि चीजें object dtype है, जो एक अच्छी बात नहीं है करने के लिए डाली हो, तुम सब दक्षता खो देते हैं। तो एक तरीका यह है कि कन्वर्ट करना है जो आवश्यकतानुसार फ्लोट/इंट टाइप टाइप करेगा।

हम एक और प्रश्न का उत्तर है, अगर आप सभी को एक बार फ्रेम का निर्माण (या स्तंभ से स्तंभ का निर्माण) इस चरण

In [23]: def convert(x): 
    ....:  try: 
    ....:   return x.astype(int) 
    ....:  except: 
    ....:   return x 
    ....:  

In [24]: df.apply(convert) 
Out[24]: 
    a b c d 
x 10 10 NaN 10 
y 1 5 2 3 
z 1 2 3 4 

In [25]: df.apply(convert).dtypes 
Out[25]: 
a  int64 
b  int64 
c float64 
d  int64 
dtype: object 

In [26]: df.apply(convert).to_csv('test.csv') 

In [27]: !cat test.csv 
,a,b,c,d 
x,10,10,,10 
y,1,5,2.0,3 
z,1,2,3.0,4 
+2

लेकिन फिर 'c' कॉलम में' .0' है ...: –

+1

क्योंकि यह एक फ्लोट है! वहां कोई विकल्प नहीं है (ठीक है आप '' float_format = '%। 0f''' से 'to_csv'' पास कर सकते हैं, लेकिन इससे सटीकता का नुकसान हो सकता है - – Jeff

+1

लेकिन ..., यदि आप dtype = object (उदा। ओपी के निर्माण के माध्यम से एक्स और डीएफ में, जो मैं सहमत हूं वह सबसे अच्छा तरीका नहीं है) तो 2, 3 और 10s सभी चींटियां हैं ...वैसे भी चिंता के बारे में हमेशा के लायक नहीं है। ऐसा लगता है कि ओपी के प्रयासों के हस्तांतरण की तरह ही है: –

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