Boş değerleri nan yerine boş dize olarak okumak için pandas.read_csv dosyasını alın


102

Bazı CSV verilerini okumak için panda kitaplığını kullanıyorum. Verilerimde, bazı sütunlar dizeler içeriyor. Dize "nan", boş bir dize olduğu gibi olası bir değerdir. Pandaların "nan" dizesini bir dizge olarak okumasını başardım, ancak boş bir değeri NaN olarak okumamayı nasıl elde edeceğimi çözemiyorum. İşte örnek veriler ve çıktı

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

Bu doğru dize "nan olarak "nan"' okur, ama yine de NaN olarak boş hücreler okur. Ben de geçen çalıştı stryılında converters(ile read_csv için argüman converters={'One': str})), ama yine de NaN olarak boş hücreler okur.

Okuduktan sonra değerleri fillna ile doldurabileceğimin farkındayım, ancak pandalara belirli bir CSV sütunundaki boş bir hücrenin NaN yerine boş bir dize olarak okunması gerektiğini söylemenin gerçekten bir yolu yok mu?


Daha basit olanı not edin, keep_default_naaşağıdaki daha yeni seçeneği kullanarak yanıtlayın .
nealmcb

Yanıtlar:


57

Buraya bir çeşit seçenek eklemek için bir bilet ekledim:

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

Bu arada result.fillna('')ne istersen yapmalısın

DÜZENLEME: geliştirme sürümünde (son 0.8.0 olacak) boş bir liste belirtirseniz na_values, boş dizeler sonuçta boş dizeler olarak kalacaktır.


12
İçin belgeler DataFrame.fillna. Deneyin result.fillna('', inplace=True). Aksi takdirde dataframe'in bir kopyasını oluşturur.
Sergey Orshanskiy

1
Bu kadar eski bir cevabı dirilttiğim için üzgünüm, ama bu hiç oldu mu? Bildiğim kadarıyla söyleyebilirim olarak bu GitHub PR hiç birleşti olmadan kapatıldı ve ben talep pandalar versiyon 0.14.x içinde davranış göremiyorum
drammock

10
Read_csv belgeleri artık hem na_values(sütunlara göre dizinlenmiş liste veya dikte ) hem de keep_default_na(bool) sunuyor. keep_default_naDeğeri pandaların varsayılan NA değerleri değiştirilmesi veya eklenmesi gerektiğini belirtir. OP'nin kodu şu anda çalışmıyor çünkü bu bayrak eksik. Bu örnek için kullanabilirsiniz pandas.read_csv('test.csv',na_values=['nan'], keep_default_na=False).
Michael Delgado

@delgadom Beni yönlendirdiğiniz için teşekkürler keep_default_na. Ancak, 'nan'ın da varsayılan olarak değerlendirilmesini istemediğini unutmayın. Yeni bir cevap olarak daha eksiksiz bir açıklama ekledim.
nealmcb

bununla tekrar karşılaştı. Düzeltme kolaydır (en iyi cevap aşağıdaki gibidir keep_default_na=False) ancak pandaların bu konudaki varsayılan davranışı IMO'dur. herhangi bir nedenle pandalar read_csv bir sütun sayısal değilse, boş dizeleri otomatik olarak NaN olarak değiştirmemelidir.
pietroppeter

114

Diğer cevapları ve yorumları okuduktan sonra hala kafam karışmıştı. Ama cevap şimdi daha basit görünüyor, işte buyrun.

Pandas sürüm 0.9'dan (2012'den itibaren), csv'nizi boş dizeler olarak yorumlanan boş hücrelerle, basitçe ayarlayarak okuyabilirsiniz keep_default_na=False:

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

Bu konu daha net bir şekilde açıklanmıştır.

Bu, Pandas sürüm 0.9 için 19 Ağustos 2012'de düzeltildi.


5
Bu açıkça en iyi cevap, ilk çözüm olarak belirlenmelidir. Teşekkürler @nealmcb
dzof31

3
Bu neden daha popüler bir cevap değil? Dünden beri bu çözümü arıyordum. Teşekkürler!
anish

7

Bunun için Pandas read_csv'de basit bir argümanımız var:

Kullanım:

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

Pandalar dokümantasyonu, yukarıdaki argümanın nasıl çalıştığını açıkça açıklamaktadır.

Bağlantı


OP gibi görünüyor mu kullanmak istiyorum na_values"nan" tanımak, ancak dönüm na_filterolduğunu yenilgi olacaktır tamamen kapatır. Böylece cevabım keep_default_na=False.
nealmcb
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.