2013-06-13 32 views
15

Bir CSV dosyasına vermek istediğim bir pandas.DataFrame var. Ancak pandalar, bazı değerleri int türleri yerine float olarak yazıyor gibi görünüyor. Bu davranışı nasıl değiştireceğimi bulamadım.Python pandas: tamsayılarla csv'ye çıktı verileri çerçevesi

bir veri çerçevesini oluşturma:

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 

Görünüm o:

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

İhracat o:

>>> 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 

Neden onlarca bir nokta sıfır var?

Tabii, sadece bütün CSV dosyasını yeniden dönüştürmeye benim boru hattına bu işlevi sopa olabilir, ama gereksiz görünüyor:

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

olarak 'ithalat pandalar Bunu neden yapmalıyım @Andy gerektiğini siz: Bu başvuru için sonunda benim sorun çözüldü nedir? İsim alanları, onları kısaltmanıza ve okunamaz hale gelene kadar harika bir fikir. – xApple

+0

Bu standart, benzer şekilde numpy np'dir (ve pd.np olarak kullanılabilir). pandalar pd'den anlamlı ölçüde daha uzundur, her defasında yazarak kodu * daha az * okunabilir IMO yapar. –

cevap

8

ihtiyaç olmayacaktır kerede çerçeveyi oluşturmak (veya sütun sütun inşa) eğer biz arıyordu cevap hafif bir varyasyonu olduğunu, başka bir soru cevap gibi

Cevabında @Jeff ne önerdi? Kredi ona gider.

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

Bu, herhangi bir yüzdeye sahip olmakla birlikte NaN bilgilerini kaybedersiniz. Belki de NA'yı -9999 ile veya veri kümenizde 'gerçek' olmadığını bildiğiniz bir değerle doldurun. – Cyrille

8

Bu NaN'ler ile tamsayı sütunlar float dönüştürülür bir "gotcha" in pandas (Support for integer NA) vardır.

Bu işlem, büyük oranda bellek ve performans nedenleriyle ve sonuçta ortaya çıkan Seriler “sayısal” olmaya devam ediyor. Bir olasılık, bunun yerine dtype=object dizilerini kullanmaktır.

+0

Tüm dosyayı yeniden göndermeden onları tamsayı olarak almanın yolu yok mu? Df.fillna() 'yi kullanmamı ne dersin? – xApple

+2

'x' ve' df' oluştururken 'dtype = object' (' int 'yerine) kullanın. –

7

sorun satırlara göre şeyler atama vardır, ama işler iyi bir şey değil object d_type, döküm olsun böylece dtypes, sütunlar göre gruplandırılmış beri, tüm verimliliğini kaybeder olmasıdır. Yani bir yol, gerektiği gibi float/int dtype'a zorlanmaya dönüşür. Eğer bu adımı

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

Ama sonra 'c' sütunlarında' .0' vardır ...: s –

+1

bir float çünkü! Orada bir seçim yok (iyi sen float_format = '%. 0f' '' to_csv'' geçebilir ama bu hassaslık kaybına yol açabilir - – Jeff

+1

Ama eğer ..., dtype = nesne kullanırsanız OP'nin inşasıyla x ve df olarak kabul ettiğim en iyi yol değil, o zaman 2, 3 ve 10'ların hepsi ints ...Neredeyse her zaman endişelenmeye değmez. Bu OP'nin çabasının değişmesi gibi görünüyor: s –

İlgili konular