2013-02-28 28 views
8

Tôi đang cố gắng xử lý dữ liệu được lưu vào CSV có thể có giá trị thiếu trong một số cột không xác định (tối đa khoảng 30). Tôi đang cố gắng đặt các giá trị bị thiếu đó thành '0' bằng cách sử dụng đối số filling_missing của genfromtxt. Dưới đây là một ví dụ làm việc tối thiểu cho numpy 1.6.2 chạy trong ActiveState ActivePython 2.7 32 bit trên Win 7.NumPy genfromtxt: sử dụng fill_missing đúng

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 

Và kết quả:

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 

Từ hướng dẫn sử dụng NumPy Tôi mong chờ filling_values=0filling_values={None:0} để làm việc nhưng thay vào đó họ không làm, và ném một lỗi tương ứng. Khi bạn chỉ định đúng cột (filling_values={1:0}) nó sẽ hoạt động, nhưng vì tôi có một số lượng lớn các cột chưa biết trước khi lựa chọn bởi người dùng, tôi đang tìm cách tự động đặt các giá trị được điền như hướng dẫn sử dụng.

Tôi tưởng tượng tôi có thể đếm trước các cột và tạo ra giá trị để chuyển thành giá trị để điền_values ​​trong thời gian chờ đợi, nhưng có cách nào tốt hơn không?

+0

Có tồn tại một báo cáo lỗi: http://projects.scipy.org/numpy/ticket/1722 – Holger

+0

Cảm ơn, tôi thêm một nhận xét về vấn đề này trên tracker github lỗi. https://github.com/numpy/numpy/issues/2317 – Thav

+1

Lỗi này hiện đã được khắc phục trong phiên bản phát triển phần mềm: https://github.com/numpy/numpy/pull/4968 –

Trả lời

8

Nó không rõ ràng từ tài liệu, nhưng filling_values="0" hoạt động.

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

Điều đó phù hợp với tôi! Tôi đã nhìn thấy một câu hỏi SO khác liên quan đến đối số missing_values, và người ta nói rằng các trích dẫn không giúp ích gì ở đó, vì vậy tôi không bận tâm để thử nó ở đây. – Thav

Các vấn đề liên quan