Панди Замініть NaN порожнім / порожнім рядком


218

У мене є фрейм даних Pandas, як показано нижче:

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

Я хочу видалити значення NaN порожнім рядком, щоб він виглядав так:

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

Відповіді:


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

Це може допомогти. Він замінить усі NaN на порожній рядок.


1
з якої бібліотеки np.nanпоходить? Я не можу ним користуватися
CaffeineConnoisseur

8
@CaffeineConnoisseur: import numpy as np.
Джон Цвінк

26
@CaffeineConnoisseur - або просто pd.np.nanякщо ви теж не хочете import numpy.
elPastor

1
Це також дозволяє зберегти Dict як рядок у рядку .csv і потім згодом прочитати його назад у DataFrame за допомогоюpd.DataFrame.from_dict(eval(_string_))
yeliabsalohcin

5
Також корисно згадати ... inplace=Trueваріант.
smci

342
df = df.fillna('')

або просто

df.fillna('', inplace=True)

Це заповнить na (наприклад, NaN) ''.

Якщо ви хочете заповнити одну колонку, ви можете використовувати:

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

Можна використовувати df['column1']замість цього df.column1.


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

99

Якщо ви читаєте фрейм даних з файлу (скажімо, CSV або Excel), тоді використовуйте:

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

Це автоматично вважатиме порожні поля порожніми рядками ''


Якщо у вас вже є кадр даних

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

na_filter недоступний у read_excel () pandas.pydata.org/pandas-docs/stable/…
Marjorie Roswell,

я використав це у своїй програмі. Він існує, але чомусь вони не вказали цей аргумент у документах. Це добре працює для мене, хоча без помилок.
Natesh bhat

Це працює, я використовую його в розборіxl.parse('sheet_name', na_filter=False)
Дмитро

5

Використовуйте формат, якщо ви хочете лише відформатувати його, щоб він добре відображався під час друку . Просто використовуйте df.to_string(... formattersдля визначення користувальницького форматування рядків, без необхідності змінювати DataFrame або витрачати пам'ять:

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

Отримати:

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

4
print df.fillna('')сам по собі (не роблячи df = df.fillna('')) також не змінює оригінал. Чи є швидкість чи інша перевага використання to_string?
фантастичний

Досить справедливо, df.fillna('')так!
Стів Шуліст

@shadowtalker: Не обов'язково, це була б правильна відповідь, якщо ОП хотіла б зберегти df в одному форматі (наприклад, більш обчислювально-економічно чи зберегти пам'ять на непотрібних / порожніх / дублюючих рядках), але візуально перетворити його в більш приємний спосіб. Не знаючи більше про випадок використання, ми не можемо сказати точно.
smci

2

Спробуйте це,

додати inplace=True

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


0

При перетворенні DataFrame в JSON, NaNдасть помилку , так краще рішення в цьому випадку є використання для заміни NaNз None.
Ось як:

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

0

Я спробував з одним стовпцем значень рядків з nan.

Щоб видалити нан і заповнити порожній рядок:

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

Щоб видалити нан і заповнити деякі значення:

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

Я також спробував df.iloc. але йому потрібен індекс стовпця. тож вам потрібно заглянути в таблицю ще раз. просто вищевказаний метод зменшив один крок.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.