Dapatkan pandas.read_csv untuk membaca nilai kosong sebagai string kosong, bukan nan

103

Saya menggunakan perpustakaan pandas untuk membaca beberapa data CSV. Dalam data saya, kolom tertentu berisi string. Benangnya"nan" adalah nilai yang mungkin, seperti string kosong. Saya berhasil membuat panda membaca "nan" sebagai string, tetapi saya tidak tahu bagaimana membuatnya tidak membaca nilai kosong sebagai NaN. Berikut contoh data dan keluarannya

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

Ini dengan benar membaca "nan" sebagai string "nan ', tetapi masih membaca sel kosong sebagai NaN. Saya mencoba meneruskan str dalam convertersargumen untuk read_csv (dengan converters={'One': str})), tetapi masih membaca sel kosong sebagai NaN.

Saya menyadari bahwa saya dapat mengisi nilai setelah membaca, dengan fillna, tetapi apakah benar-benar tidak ada cara untuk memberi tahu panda bahwa sel kosong di kolom CSV tertentu harus dibaca sebagai string kosong, bukan NaN?

BrenBarn
sumber
Perhatikan jawaban yang lebih sederhana menggunakan opsi yang lebih baru di keep_default_nabawah ini.
nealmcb

Jawaban:

57

Saya menambahkan tiket untuk menambahkan opsi di sini:

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

Sementara itu, result.fillna('')lakukan apa yang Anda inginkan

EDIT: dalam versi pengembangan (menjadi 0.8.0 final) jika Anda menentukan daftar na_valueskosong, string kosong akan tetap menjadi string kosong di hasil

Wes McKinney
sumber
12
Dokumentasi untuk DataFrame.fillna. Coba result.fillna('', inplace=True). Jika tidak, itu membuat salinan bingkai data.
Sergey Orshanskiy
1
maaf untuk membangkitkan jawaban lama seperti itu, tetapi apakah ini pernah terjadi? Sejauh yang saya tahu dari PR GitHub ini ditutup tanpa pernah digabungkan, dan saya tidak melihat perilaku yang diminta dalam pandas versi 0.14.x
drammock
10
Dokumentasi untuk read_csv sekarang menawarkan na_values(daftar atau dikt diindeks oleh kolom) dan keep_default_na(bool). The keep_default_navalue menunjukkan apakah standar nilai NA panda harus diganti atau ditambahkan ke. Kode OP tidak berfungsi saat ini hanya karena tidak ada bendera ini. Untuk contoh ini, Anda bisa menggunakan pandas.read_csv('test.csv',na_values=['nan'], keep_default_na=False).
Michael Delgado
@delgadom Terima kasih telah menuntun saya ke keep_default_na. Tapi perhatikan bahwa dia tidak ingin 'nan' diperlakukan sebagai default juga. Saya telah menambahkan penjelasan yang lebih lengkap sebagai jawaban baru.
nealmcb
1
mengalami ini lagi. memperbaikinya mudah (jawaban terbaik adalah seperti di bawah ini untuk dimasukkan keep_default_na=False) tetapi perilaku default panda dalam hal ini IMO buruk. jika karena alasan tertentu pandas read_csv menyimpulkan kolom bukan numerik, ia seharusnya tidak secara otomatis mengubah string kosong menjadi NaN.
pietroppeter
117

Saya masih bingung setelah membaca jawaban dan komentar lainnya. Tetapi jawabannya sekarang tampaknya lebih sederhana, jadi ini dia.

Sejak Pandas versi 0.9 (dari 2012), Anda dapat membaca csv Anda dengan sel kosong yang ditafsirkan sebagai string kosong hanya dengan menyetel keep_default_na=False:

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

Masalah ini dijelaskan lebih jelas di

Itu diperbaiki pada 19 Agustus 2012 untuk Pandas versi 0.9 in

nealmcb.dll
sumber
6
Ini jelas merupakan jawaban terbaik, ini harus ditetapkan sebagai solusi pertama. Terima kasih @nealmcb
dzof31
3
Mengapa ini bukan jawaban yang lebih populer? Sudah mencari solusi ini sejak kemarin. Terima kasih!
anish
8

Kami memiliki argumen sederhana di Pandas read_csv untuk ini:

Menggunakan:

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

Dokumentasi panda dengan jelas menjelaskan cara kerja argumen di atas.

Tautan

Sundeep
sumber
Sepertinya OP memang ingin menggunakan na_valuesuntuk mengenali "nan", tetapi na_filtermematikan sepenuhnya akan mengalahkannya. Demikian jawaban saya dengan keep_default_na=False.
nealmcb