Подтвердить что ты не робот

Как установить ячейку в 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, но здесь мне нужно использовать логическое условие.

4b9b3361

Ответ 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