Панды Заменить NaN пустой / пустой строкой

219

У меня есть Pandas Dataframe, как показано ниже:

    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
user1452759
источник

Ответы:

263
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
344
df = df.fillna('')

или просто

df.fillna('', inplace=True)

Это заполнит Na (например, NaN) с ''.

Если вы хотите заполнить один столбец, вы можете использовать:

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

Можно использовать df['column1']вместо df.column1.

fantabolous
источник
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/…
Марджори Розуэлл,
Я использовал это в моем приложении. Он существует, но по какой-то причине они не дали этот аргумент в документах. Это работает хорошо для меня, хотя и без ошибок.
Натеш Бхат
Это работает, я использую это в 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 в одном формате (например, более эффективный в вычислительном отношении или экономить память на ненужных / пустых / дублирующих строках), но визуализировать его в более приятный путь. Не зная больше о сценарии использования, мы не можем сказать наверняка.
СМСИ
2

Попробуй это,

Добавить inplace=True

import numpy as np
df.replace(np.NaN, ' ', inplace=True)
Винееш ТП
источник
1

Использование keep_default_na=False должно помочь вам:

df = pd.read_csv(filename, keep_default_na=False)
Бенди Латортю
источник
0

Если вы конвертируете DataFrame в JSON, выдает NaNошибку, поэтому лучшим решением в этом случае является замена NaNна None.
Вот как:

df1 = df.where((pd.notnull(df)), None)
Динеш Хетарпал
источник
0

Я попытался с одним столбцом строковых значений с нан.

Чтобы удалить нан и заполнить пустую строку:

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

Чтобы удалить нан и заполнить некоторые значения:

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

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

Subbu VidyaSekar
источник