2013-02-28 16 views
8

Bilinmeyen sayıda sütunda eksik değerlere sahip olabilecek (yaklaşık 30'a kadar) CSV'ye kaydedilen verileri işlemeye çalışıyorum. genfromtxtfilling_missing argümanını kullanarak bu eksik değerleri '0' olarak ayarlamaya çalışıyorum. Ben filling_values=0 beklenir NumPy kullanım kılavuzundanNumPy genfromtxt: fill_missing'i kullanarak doğru

plain [(1.0, 2.0, 3.0, 4.0) (5.0, nan, 7.0, 8.0)] 
filling_values=0 [(1.0, 2.0, 3.0, 4.0) (5.0, nan, 7.0, 8.0)] 
filling_values={1:0} [(1.0, 2.0, 3.0, 4.0) (5.0, 0.0, 7.0, 8.0)] 
filling_values={0:0} [(1.0, 2.0, 3.0, 4.0) (5.0, nan, 7.0, 8.0)] 

Traceback (most recent call last): 
    File "C:\Users\tolivo.EE\Documents\active\eng\python\sizer\testGenfromtxt.py", line 20, in <module> 
    a = numpy.genfromtxt('test.txt',delimiter=',',names=True,filling_values={None:0}) 
    File "C:\Users\tolivo.EE\AppData\Roaming\Python\Python27\site-packages\numpy\lib\npyio.py", line 1451, in genfromtxt 
    filling_values[key] = val 
TypeError: list indices must be integers, not NoneType 

ve: İşte numpy 1.6.2 Win 7. ActiveState ActivePython içinde

import numpy 

text = "a,b,c,d\n1,2,3,4\n5,,7,8" 
a = numpy.genfromtxt('test.txt',delimiter=',',names=True) 
b = open('test.txt','w') 
b.write(text) 
b.close() 
a = numpy.genfromtxt('test.txt',delimiter=',',names=True) 
print "plain",a 

a = numpy.genfromtxt('test.txt',delimiter=',',names=True,filling_values=0) 
print "filling_values=0",a 

a = numpy.genfromtxt('test.txt',delimiter=',',names=True,filling_values={1:0}) 
print "filling_values={1:0}",a 

a = numpy.genfromtxt('test.txt',delimiter=',',names=True,filling_values={0:0}) 
print "filling_values={0:0}",a 

a = numpy.genfromtxt('test.txt',delimiter=',',names=True,filling_values={None:0}) 
print "filling_values={None:0}",a 

Ve sonuç 2.7 32 bit çalıştırmak için minimal bir çalışma örneğidir Çalışmak için filling_values={None:0} ama bunun yerine sırasıyla bir hata atıyorlar. Doğru sütunu (filling_values={1:0}) belirttiğinizde işe yarayacak, ancak kullanıcı tarafından seçim yapmadan önce bilinmeyen bir sayıdaki sütunların büyük bir kısmına sahip olduğum için, doldurulmuş değerleri otomatik olarak kullanıcı kılavuzu ipuçlarına benzer şekilde ayarlamanın yolunu arıyorum.

Sanırım sütunları önceden sayabilirim ve bu arada fill_values ​​değeri olarak geçmek için bir dict oluşturabilirim, ama daha iyi bir yol var mı?

+0

bir hata raporu söz konusudur: http://projects.scipy.org/numpy/ticket/1722 – Holger

+0

sayesinde ben github hata izci konuya yorum ekledi. https://github.com/numpy/numpy/issues/2317 – Thav

+1

Hata, şu anki geliştirme sürümüne sabitlenmiştir: https://github.com/numpy/numpy/pull/4968 –

cevap

8

Bu belgelerden açıkça görülmüyor, ancak filling_values="0" çalışır.

In [19]: !cat test.txt 
a,b,c,d 
1,2,3,4 
5,,7,8 
9,10,,12 

In [20]: a = numpy.genfromtxt('test.txt', delimiter=',', names=True, filling_values="0") 

In [21]: print a 
[(1.0, 2.0, 3.0, 4.0) (5.0, 0.0, 7.0, 8.0) (9.0, 10.0, 0.0, 12.0)] 
+0

Bu benim için işe yarıyor! Eksik_değer argümanıyla ilgili bir başka soru daha görmüştüm ve alıntıların oraya yardım etmediği söylendi, bu yüzden burada denemek için uğraşmadım. – Thav