Pandy Zamień NaN na pusty / pusty ciąg

218

Mam ramkę danych Pandas, jak pokazano poniżej:

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

Chcę usunąć wartości NaN z pustym ciągiem, aby wyglądał tak:

    1    2       3
 0  a   ""    read
 1  b    l  unread
 2  c   ""    read
użytkownik 1452759
źródło

Odpowiedzi:

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

To może pomóc. Zastąpi wszystkie NaN pustym łańcuchem.

nEO
źródło
1
z jakiej biblioteki np.nanpochodzi? Nie mogę tego użyć
CaffeineConnoisseur
8
@CaffeineConnoisseur: import numpy as np.
John Zwinck,
26
@CaffeineConnoisseur - lub tylko pd.np.nanjeśli nie chcesz import numpy.
elPastor
1
Pozwala to również zapisać Dict jako ciąg znaków w wierszu .csv, a następnie odczytać z powrotem do DataFrame, używającpd.DataFrame.from_dict(eval(_string_))
yeliabsalohcin
5
Warto również wspomnieć o ... inplace=Trueopcji.
smci
342
df = df.fillna('')

Lub tylko

df.fillna('', inplace=True)

Spowoduje to wypełnienie na (np. NaN) ''.

Jeśli chcesz wypełnić jedną kolumnę, możesz użyć:

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

Można użyć df['column1']zamiast df.column1.

fantastyczny
źródło
5
@Mithril -df[['column1','column2']] = df[['column1','column2']].fillna('')
elPastor
99

Jeśli czytasz ramkę danych z pliku (powiedzmy CSV lub Excel), użyj:

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

Spowoduje to automatyczne uznanie pustych pól za puste ciągi ''


Jeśli masz już ramkę danych

  • df = df.replace(np.nan, '', regex=True)
  • df = df.fillna('')
Natesh bhat
źródło
na_filter nie jest dostępny na read_excel () pandas.pydata.org/pandas-docs/stable/…
Marjorie Roswell
Użyłem go w mojej aplikacji. Istnieje, ale z jakiegoś powodu nie podali tego argumentu w dokumentacji. Działa dla mnie dobrze, ale bez błędów.
Natesh bhat
Działa, używam go w parseciexl.parse('sheet_name', na_filter=False)
Dmitrii,
5

Użyj formatyzatora, jeśli chcesz go tylko sformatować, aby dobrze się renderował po wydrukowaniu . Wystarczy użyć, df.to_string(... formattersaby zdefiniować niestandardowe formatowanie łańcucha, bez niepotrzebnej modyfikacji DataFrame lub marnowania pamięci:

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)})

Aby uzyskać:

   A B       C
0  a      read
1  b 1  unread
2  c      read
Steve Schulist
źródło
4
print df.fillna('')sam w sobie (bez robienia df = df.fillna('')) nie modyfikuje również oryginału. Czy istnieje szybkość lub inna korzyść z używania to_string?
fantastyczny
W porządku, df.fillna('')to prawda!
Steve Schulist
@shadowtalker: Niekoniecznie byłaby to poprawna odpowiedź, gdyby OP chciał zachować df w jednym formacie (np. bardziej wydajnym obliczeniowo lub oszczędzając pamięć na niepotrzebnych / pustych / zduplikowanych ciągach), ale renderować go wizualnie w bardziej przyjemny sposób. Nie wiedząc więcej o przypadku użycia, nie możemy być tego pewni.
smci
2

Spróbuj tego,

Dodaj inplace=True

import numpy as np
df.replace(np.NaN, ' ', inplace=True)
Vineesh TP
źródło
1

używanie keep_default_na=False powinno pomóc ci:

df = pd.read_csv(filename, keep_default_na=False)
Bendy Latortue
źródło
0

Jeśli konwertujesz DataFrame na JSON, NaNwyświetli błąd, więc najlepszym rozwiązaniem jest w tym przypadku zastąpienie NaNgo None.
Oto jak:

df1 = df.where((pd.notnull(df)), None)
Dinesh Khetarpal
źródło
0

Próbowałem z jedną kolumną wartości ciągów z nan.

Aby usunąć nan i wypełnić pusty ciąg:

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

Aby usunąć nan i wypełnić niektóre wartości:

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

Próbowałem też df.iloc. ale potrzebuje indeksu kolumny. więc musisz ponownie zajrzeć do stołu. po prostu powyższa metoda zmniejszyła jeden krok.

Subbu VidyaSekar
źródło