Как заменить значения None во фрейме данных Pandas в Python?

Есть ли способ заменить значения наNone в пандах в питоне?

Ты можешь использоватьdf.replace('pre', 'post') и может заменить значение другим, но это можетсделать, если вы хотите заменить наNone значение, которое, если вы попробуете, вы получите странный результат.

Так вот'Вот пример:

df = DataFrame(['-',3,2,5,1,-5,-1,'-',9])
df.replace('-', 0)

который возвращает успешный результат.

Но,

df.replace('-', None)

который возвращает следующий результат:

0
0   - // this isn't replaced
1   3
2   2
3   5
4   1
5  -5
6  -1
7  -1 // this is changed to `-1`...
8   9

Почему такой странный результат возвращается?

Поскольку я хочу добавить этот фрейм данных в базу данных MySQL, я могут поставитьNaN значения в любой элемент в моем фрейме данных и вместо этого хотите поставитьNone, Конечно, вы можете сначала изменить'-' вNaN а затем конвертироватьNaN вNone, но я хочу знать, почему датафрейм действует так ужасно.

 cs9529 апр. 2019 г., 12:11
Если вы читаете эти данные из CSV / ExcelВы можете прочитать эти значения как NaN, используяna_values аргумент.Больше информации в этом ответе.
 Andy Hayden13 июн. 2013 г., 23:36
Лиwrite_frame не разбиратьNaNсnones?
 Andy Hayden13 июн. 2013 г., 23:41
Какую версию панд вы используете?
 Andy Hayden13 июн. 2013 г., 23:49
Scipy Super Pack выдает Dev? Хорошо, я определенно думаю, что ты долженподнять это как проблему на GitHubне долженэто слишком сложно исправить.
 Blaszard13 июн. 2013 г., 23:40
Ага. Вы сталкиваетесьInternalError: (1054, u"Unknown column 'nan' in 'field list'") ошибка. Я нене знаю о каких-либо решениях, кроме преобразованияNaN вNone перед выполнениемwrite_frame метод.

Ответы на вопрос(5)

Я предпочитаю решение с использованиемreplace сdict из-за своей простоты и элегантности:

df.replace({'-': None})

Вы также можете иметь больше замен:

df.replace({'-': None, 'None': None})

И даже для более крупных замен всегда очевидно и ясно, что заменяется чем, что, на мой взгляд, намного сложнее для длинных списков.

Решение Вопроса

На самом деле в более поздних версиях панд это даст TypeError:

df.replace('-', None)
TypeError: If "to_replace" and "value" are both None then regex must be a mapping

Вы можете сделать это, передавая список или словарь:

In [11]: df.replace('-', df.replace(['-'], [None]) # or .replace('-', {0: None})
Out[11]:
      0
0  None
1     3
2     2
3     5
4     1
5    -5
6    -1
7  None
8     9

Но я рекомендую использовать NaN, а не None:

In [12]: df.replace('-', np.nan)
Out[12]:
     0
0  NaN
1    3
2    2
3    5
4    1
5   -5
6   -1
7  NaN
8    9
 Andy Hayden17 мар. 2017 г., 15:08
@lin_bug Я думаю, что это просто df.replace (['-'], [None]) :) хороший улов!
 Andy Hayden17 мар. 2017 г., 15:13
@lin_bug Хотя кажется, что больше не работает в последних версиях панд. df.where (ДФ =! '-'Нет) работает
 Andy Hayden18 апр. 2019 г., 00:08
@raffamaidendf.where(df!='-', None) Кажется, работает, возможно, единственный, кто работает. Да, этот ответ довольно старый (почти 6 лет! Я думаю, что deprecation / warning / TypeError был удален), определенно согласен с cs95, что он должен быть проанализирован во время read_csv.
 DSM13 июн. 2013 г., 23:30
Или просто список, напримерdf.replace(['-'], [None]), или жеdf.replace({'-': None}), Я думаю. ИспользованиеNone поскольку дозорный исключает использование его как значения тоже
 Andy Hayden19 апр. 2019 г., 01:03
@raffamaiden, возможно, стоит создать проблему, проблема в том, что None в python используется для всех необязательных аргументов, чтобы панды могли 'не скажу ли этоs .replace (x) против .replace (x, None) ... который сказал, что это странное поведение в любом случае
 Andy Hayden13 июн. 2013 г., 23:40
@ user2360798 replace на самом деле очень многофункциональная (читай сложная) функция,(DEV) строка документации это действительно хорошо, хотя
 raffamaiden17 апр. 2019 г., 08:58
Я неНе знаю, какая версия панд вернет эту ошибку. У меня есть панды 0.23.4, и для меня не было ошибки TypeError. pandas отображает поведение, объясненное @Blaszard: vlue копируется из строки раньше, а не устанавливается в None
 lin_bug17 мар. 2017 г., 12:11
@AndyHaydendf.replace('-', df.replace(['-'], [None]) выглядит странно, это опечатка?
 raffamaiden19 апр. 2019 г., 00:59
@AndyHayden Я согласен с ним, но все же, странно ли поведение присвоения значения предыдущей строки None где-то задокументировано или это ошибка?
 luckyging3r26 сент. 2016 г., 02:22
Я нене знаю, если этоочевидно, но пришлось назначитьdf вернуться к себе, как:df = df.replace({'?': np.nan})

where вероятно то что тыищу. Так

data=data.where(data=='-', None) 

Отпанда документы:

where [возвращает] объект той же формы, что и self, и соответствующие записи которого принадлежат self, где cond равно True, а в противном случае - другому).

 Juan09 сент. 2016 г., 18:36
Просто и точно! Спасибо.
 clg405 июл. 2017 г., 01:10
Это на самом деле неточно. Данные = data.where (данные == '-', None) заменит все, что НЕ РАВНО для '-' ни с кем. Версия Pandas где хранит значение первого аргумента (в данном случае data == '-') и замените все остальное вторым аргументом (в данном случае None). Это немного сбивает с толку, поскольку np.where более явный, поскольку он запрашивает условное выражение в первом аргументе, затем if true во втором аргументе, а затем if false в 3-м аргументе.

Установка нулевых значений может быть выполнена с помощью:np.nan

import numpy as np
df.replace('-', np.nan)

Преимущество в том, чтоdf.last_valid_index() признает их недействительными.

df = pd.DataFrame(['-',3,2,5,1,-5,-1,'-',9])
df = df.where(df!='-', None)

Ваш ответ на вопрос