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


person Mark Morrisson    schedule 14.01.2016    source источник
comment
Я чувствую, что название вводит в заблуждение. Проблема не в том, что вы хотите, чтобы NaN был в вашем фрейме данных. Проблема в том, что вы пытаетесь установить копию фрагмента из DataFrame.   -  person Teepeemm    schedule 11.09.2020


Ответы (8)


просто используйте 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
person EdChum    schedule 14.01.2016

Хотя использование replace, кажется, решает проблему, я хотел бы предложить альтернативу. Проблема с сочетанием числовых и некоторых строковых значений в столбце, чтобы строки не заменялись на np.nan, а чтобы весь столбец был правильным. Могу поспорить, что исходный столбец, скорее всего, имеет тип объекта

Name: y, dtype: object

Что вам действительно нужно, так это сделать его числовым столбцом (он будет иметь правильный тип и будет намного быстрее), со всеми нечисловыми значениями, замененными NaN.

Таким образом, хорошим кодом преобразования будет

pd.to_numeric(df['y'], errors='coerce')

Укажите errors='coerce', чтобы строки, которые не могут быть преобразованы в числовое значение, стали NaN. Тип столбца будет

Name: y, dtype: float64
person Severin Pappadeux    schedule 14.01.2016

Вы можете использовать замену:

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 – заменить

person jmorrison    schedule 14.01.2016

Начиная с pandas 1.0.0 вам больше не нужно использовать numpy для создания нулевых значений в вашем фрейме данных. Вместо этого вы можете просто использовать pandas.NA (который имеет тип pandas._libs.missing.NAType), поэтому он будет рассматриваться как нулевой внутри фрейма данных, но не будет нулевым вне контекста фрейма данных.

person slevin886    schedule 29.07.2020
comment
Хотя это не решает проблему ОП, я проголосовал за, потому что это фактически ответило на вопрос в заголовке. - person Teepeemm; 11.09.2020

Большинство ответов здесь должны import numpy as np

В самой панде есть встроенное решение: pd.NA, которое можно использовать следующим образом:

df.replace('N/A', pd.NA)
person stallingOne    schedule 12.11.2020

df.loc[df.y == 'N/A',['y']] = np.nan

Это решит вашу проблему. С помощью двойного [] вы работаете с копией DataFrame. Вы должны указать точное местоположение в одном вызове, чтобы иметь возможность изменить его.

person jeremie benichou    schedule 06.08.2018

df.replace («значение столбца», np.NaN, inplace = True)

person sameer_nubia    schedule 28.08.2020

Вы можете попробовать эти фрагменты.

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
person rolandpeng    schedule 24.09.2017