Как установить ячейку в NaN в кадре данных pandas
Я бы хотел заменить плохие значения в столбце блока данных NaN.
mydata = {'x' : [10, 50, 18, 32, 47, 20], 'y' : ['12', '11', 'N/A', '13', '15', 'N/A']}
df = pd.DataFrame(mydata)
df[df.y == 'N/A']['y'] = np.nan
Хотя, последняя строка выходит из строя и выдает предупреждение, потому что она работает с копией df. Итак, какой правильный способ справиться с этим? Я видел много решений с iloc или ix, но здесь мне нужно использовать логическое условие.
Ответы
Ответ 1
просто используйте replace
:
In [106]:
df.replace('N/A',np.NaN)
Out[106]:
x y
0 10 12
1 50 11
2 18 NaN
3 32 13
4 47 15
5 20 NaN
То, что вы пытаетесь назвать цепочкой индексирования: http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy
Вы можете использовать loc
для обеспечения работы с исходным dF:
In [108]:
df.loc[df['y'] == 'N/A','y'] = np.nan
df
Out[108]:
x y
0 10 12
1 50 11
2 18 NaN
3 32 13
4 47 15
5 20 NaN
Ответ 2
Вы можете использовать replace:
df['y'] = df['y'].replace({'N/A': np.nan})
Также обратите внимание на параметр inplace
для replace
. Вы можете сделать что-то вроде:
df.replace({'N/A': np.nan}, inplace=True)
Это заменит все экземпляры в df без создания копии.
Аналогично, если вы используете другие типы неизвестных значений, таких как пустая строка или значение None:
df['y'] = df['y'].replace({'': np.nan})
df['y'] = df['y'].replace({None: np.nan})
Ссылка: Pandas Latest - Заменить
Ответ 3
При использовании replace
, похоже, проблема, я хотел бы предложить альтернативу. Проблема с смешиванием числовых и некоторых строковых значений в столбце не для того, чтобы строки были заменены на np.nan, но чтобы создать весь столбец. Я бы сказал, что исходный столбец, скорее всего, относится к типу объекта
Name: y, dtype: object
Что вам действительно нужно, это сделать его числовым столбцом (он будет иметь правильный тип и будет довольно быстрым), причем все нечисловые значения заменяются на NaN.
Таким образом, хороший код преобразования будет
pd.to_numeric(df['y'], errors='coerce')
Укажите errors='coerce'
, чтобы заставить строки, которые не могут быть проанализированы с числовым значением, чтобы стать NaN. Тип столбца был бы
Name: y, dtype: float64
Ответ 4
Вы можете попробовать эти фрагменты.
In [16]:mydata = {'x' : [10, 50, 18, 32, 47, 20], 'y' : ['12', '11', 'N/A', '13', '15', 'N/A']}
In [17]:df=pd.DataFrame(mydata)
In [18]:df.y[df.y=="N/A"]=np.nan
Out[19]:df
x y
0 10 12
1 50 11
2 18 NaN
3 32 13
4 47 15
5 20 NaN