Pandalar NaN'yi boş / boş dize ile değiştir


218

Aşağıda gösterildiği gibi bir Pandas Dataframe var:

    1    2       3
 0  a  NaN    read
 1  b    l  unread
 2  c  NaN    read

Öyle görünüyor ki boş bir dize ile NaN değerleri kaldırmak istiyorum:

    1    2       3
 0  a   ""    read
 1  b    l  unread
 2  c   ""    read

Yanıtlar:


261
import numpy as np
df1 = df.replace(np.nan, '', regex=True)

Bu yardımcı olabilir. Tüm NaN'leri boş bir dize ile değiştirir.


1
hangi kütüphaneden np.nangeliyor? Bunu kullanamazsınız
CaffeineConnoisseur

8
@CaffeineConnoisseur: import numpy as np.
John Zwinck

26
@CaffeineConnoisseur - ya da pd.np.nanistemiyorsanız import numpy.
elPastor

1
Bu aynı zamanda, Dict'in bir .csv satırına bir dize olarak kaydedilmesini ve daha sonra pd.DataFrame.from_dict(eval(_string_))
yeliabsalohcin

5
Ayrıca ... inplace=Trueseçeneği belirtmek yararlıdır .
smci

342
df = df.fillna('')

ya da sadece

df.fillna('', inplace=True)

Bu na'ları (örneğin NaN'ler) dolduracaktır ''.

Tek bir sütunu doldurmak istiyorsanız şunları kullanabilirsiniz:

df.column1 = df.column1.fillna('')

Bunun df['column1']yerine kullanılabilir df.column1.


5
@Mithril -df[['column1','column2']] = df[['column1','column2']].fillna('')
elPastor

99

Veri çerçevesini bir dosyadan (örneğin CSV veya Excel) okuyorsanız şunu kullanın:

  • df.read_csv(path , na_filter=False)
  • df.read_excel(path , na_filter=False)

Bu, boş alanları otomatik olarak boş dizeler olarak kabul eder ''


Veri çerçevesine zaten sahipseniz

  • df = df.replace(np.nan, '', regex=True)
  • df = df.fillna('')


Uygulamamda kullandım. Var ama bazı nedenlerden dolayı bu argümanı dokümanlarda vermediler. Hatalar olmadan olsa benim için iyi çalışıyor.
Natesh bhat

Çalışıyor, ayrıştırmada kullanıyorumxl.parse('sheet_name', na_filter=False)
Dmitrii

5

Yalnızca yazdırıldığında güzel görünmesi için biçimlendirmek istiyorsanız bir biçimlendirici kullanın . df.to_string(... formattersDataFrame'inizi gereksiz yere değiştirmeden veya belleği boşa harcamadan özel dize biçimlendirmesini tanımlamak için şunu kullanın :

df = pd.DataFrame({
    'A': ['a', 'b', 'c'],
    'B': [np.nan, 1, np.nan],
    'C': ['read', 'unread', 'read']})
print df.to_string(
    formatters={'B': lambda x: '' if pd.isnull(x) else '{:.0f}'.format(x)})

Almak:

   A B       C
0  a      read
1  b 1  unread
2  c      read

4
print df.fillna('')tek başına (yapmadan df = df.fillna('')) orijinali de değiştirmez. Kullanmanın bir hızı veya başka bir avantajı var to_stringmı?
fevkalade

Yeterince adil, df.fillna('')öyle!
Steve Schulist

@shadowtalker: Bu sadece OP'nin df'yi tek bir formatta (örneğin daha hesaplama açısından verimli veya gereksiz / boş / yinelenen dizelerde bellek tasarrufu) tutmak istemesine rağmen doğru yanıt olacaktır, ancak görsel olarak daha fazla görsel hale getirme hoş bir yol. Kullanım durumu hakkında daha fazla bilgi sahibi olmadan, kesin olarak söyleyemeyiz.
smci

2

Bunu dene,

Ekle inplace=True

import numpy as np
df.replace(np.NaN, ' ', inplace=True)

1

kullanmak keep_default_na=False size yardımcı olacaktır:

df = pd.read_csv(filename, keep_default_na=False)

0

Eğer JSON DataFrame dönüştürüyorsanız, NaNen iyi çözüm durum değiştirmektir bu kullanımda böylece hatayı verecektir NaNile None.
İşte böyle:

df1 = df.where((pd.notnull(df)), None)

0

Nan ile dize değerleri bir sütun ile denedim.

Nani kaldırmak ve boş dizeyi doldurmak için:

df.columnname.replace(np.nan,'',regex = True)

Nani çıkarmak ve bazı değerleri doldurmak için:

df.columnname.replace(np.nan,'value',regex = True)

Ben de df.iloc denedim. ancak sütunun dizinine ihtiyacı vardır. bu yüzden tekrar masaya bakmanız gerekiyor. sadece yukarıdaki yöntem bir adımı azalttı.

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.