2013-02-28 9 views
8

Próbuję przetworzyć dane zapisane w CSV, które mogą mieć brakujące wartości w nieznanej liczbie kolumn (do około 30). Próbuję ustawić te brakujące wartości na "0", używając argumentu genfromtxt 's' filling_missing. Oto przykład minimalny pracuje numpy 1.6.2 działa w ActiveState ActivePython 2.7 32 bit na Win 7.NumPy genfromtxt: używanie fill_missing poprawnie

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 

a wynik:

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 

Z instrukcji NumPy spodziewałbym filling_values=0 i filling_values={None:0} do pracy, ale zamiast tego tego nie robią i generują błąd odpowiednio. Kiedy podasz poprawną kolumnę (filling_values={1:0}), to będzie działać, ale ponieważ mam dużą liczbę kolumn o nieznanej liczbie przed wyborem przez użytkownika, szukam sposobu, aby ustawić wypełnione wartości automatycznie, jak wskazówki w przewodniku użytkownika.

sobie wyobrazić prawdopodobnie mogę liczyć kolumny z góry i utworzyć dict do przekazania jako wartość do filling_values ​​w międzyczasie, ale tam jest lepszy sposób?

+0

Istnieje raport o błędzie: http://projects.scipy.org/numpy/ticket/1722 – Holger

+0

Dzięki, dodałem komentarz do emisji na github bug trackera. https://github.com/numpy/numpy/issues/2317 – Thav

+1

Błąd został poprawiony w wersji rozwojowej numpy: https://github.com/numpy/numpy/pull/4968 –

Odpowiedz

8

To nie jest oczywiste z dokumentacji, ale działa filling_values="0".

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

To działa na mnie! Widziałem inne pytanie dotyczące SO dotyczące argumentu missing_values ​​i podano, że cytaty tam nie pomogły, więc nie próbowałem go tutaj wypróbować. – Thav

Powiązane problemy