Nhận pandas.read_csv để đọc các giá trị trống dưới dạng chuỗi trống thay vì nan


101

Tôi đang sử dụng thư viện gấu trúc để đọc một số dữ liệu CSV. Trong dữ liệu của tôi, các cột nhất định chứa các chuỗi. Chuỗi "nan"là một giá trị có thể có, cũng như một chuỗi rỗng. Tôi đã quản lý để gấu trúc đọc "nan" dưới dạng một chuỗi, nhưng tôi không thể tìm ra cách làm cho nó không đọc giá trị trống là NaN. Đây là dữ liệu mẫu và kết quả đầu ra

One,Two,Three
a,1,one
b,2,two
,3,three
d,4,nan
e,5,five
nan,6,
g,7,seven

>>> pandas.read_csv('test.csv', na_values={'One': [], "Three": []})
    One  Two  Three
0    a    1    one
1    b    2    two
2  NaN    3  three
3    d    4    nan
4    e    5   five
5  nan    6    NaN
6    g    7  seven

Nó đọc một cách chính xác "nan" như chuỗi "nan', nhưng vẫn đọc ô trống như NaN. Tôi cố gắng đi qua trong strtrong converterslập luận để read_csv (với converters={'One': str})), nhưng nó vẫn đọc ô trống như NaN.

Tôi nhận ra rằng tôi có thể điền các giá trị sau khi đọc, bằng fillna, nhưng thực sự không có cách nào để nói với gấu trúc rằng một ô trống trong một cột CSV cụ thể nên được đọc dưới dạng chuỗi trống thay vì NaN?


Lưu ý câu trả lời đơn giản hơn, sử dụng tùy chọn gần đây hơn keep_default_nabên dưới.
nealmcb

Câu trả lời:


57

Tôi đã thêm một vé để thêm một tùy chọn nào đó ở đây:

https://github.com/pydata/pandas/issues/1450

Trong khi chờ đợi, result.fillna('')nên làm những gì bạn muốn

CHỈNH SỬA: trong phiên bản phát triển (là 0.8.0 cuối cùng) nếu bạn chỉ định danh sách na_valuestrống, các chuỗi trống sẽ là chuỗi trống trong kết quả


12
Tài liệu cho DataFrame.fillna. Cố gắng result.fillna('', inplace=True). Nếu không, nó sẽ tạo ra một bản sao của khung dữ liệu.
Sergey Orshanskiy

1
xin lỗi để phục hồi một câu trả lời cũ như vậy, nhưng điều này đã bao giờ xảy ra? Theo như tôi có thể nói từ GitHub PR này nó đã được đóng cửa mà không bao giờ được sáp nhập, và tôi không nhìn thấy những hành vi được yêu cầu trong gấu trúc phiên bản 0.14.x
drammock

10
Tài liệu cho read_csv hiện cung cấp cả na_values(danh sách hoặc dict được lập chỉ mục theo cột) và keep_default_na(bool). Các keep_default_nagiá trị cho biết các giá trị mặc định NA gấu trúc nên được thay thế hoặc nối vào. Mã của OP hiện không hoạt động chỉ vì nó thiếu cờ này. Đối với ví dụ này, bạn có thể sử dụng pandas.read_csv('test.csv',na_values=['nan'], keep_default_na=False).
Michael Delgado

@delgadom Cảm ơn bạn đã dẫn tôi đến keep_default_na. Nhưng lưu ý rằng anh ấy cũng không muốn 'nan' được coi là mặc định. Tôi đã thêm một lời giải thích đầy đủ hơn như một câu trả lời mới.
nealmcb

lại gặp phải vấn đề này. việc sửa chữa rất dễ dàng (câu trả lời tốt nhất là như bên dưới keep_default_na=False) nhưng hành vi mặc định của gấu trúc về điều này là IMO xấu. nếu vì lý do nào đó pandas read_csv cho rằng một cột không phải là số, nó sẽ không tự động thay đổi các chuỗi trống thành NaN.
pietroppeter

114

Tôi vẫn còn bối rối sau khi đọc các câu trả lời và nhận xét khác. Nhưng câu trả lời bây giờ có vẻ đơn giản hơn, vì vậy bạn bắt đầu.

Kể từ phiên bản Pandas 0.9 (từ năm 2012), bạn có thể đọc csv của mình với các ô trống được hiểu là chuỗi trống bằng cách chỉ cần thiết lập keep_default_na=False:

pd.read_csv('test.csv', keep_default_na=False)

Vấn đề này được giải thích rõ ràng hơn trong

Điều đó đã được khắc phục vào ngày 19 tháng 8 năm 2012 cho phiên bản Pandas 0.9 trong


5
Đây rõ ràng là câu trả lời tốt nhất, nó nên được chỉ định là giải pháp đầu tiên. Cảm ơn @nealmcb
dzof31

3
Tại sao đây không phải là một câu trả lời phổ biến hơn? Đã tìm kiếm giải pháp này từ hôm qua. Cảm ơn!
anish

7

Chúng tôi có một đối số đơn giản trong Pandas read_csv cho điều này:

Sử dụng:

df = pd.read_csv('test.csv', na_filter= False)

Tài liệu về Pandas giải thích rõ ràng cách hoạt động của lập luận trên.

Liên kết


Dường như OP không muốn sử dụng na_valuesđể nhận ra "nan", nhưng quay na_filtertắt hoàn toàn sẽ đánh bại đó. Vì vậy, câu trả lời của tôi với keep_default_na=False.
nealmcb
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.