Як встановити для клітинки NaN у фреймі даних pandas


97

Я хотів би замінити неправильні значення у стовпці фрейму даних на 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, але тут мені потрібно використовувати логічну умову.

Відповіді:


122

просто використовуйте 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щоб переконатися, що ви працюєте на оригінальному ДФ:

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

13

Хоча використання, replaceздається, вирішує проблему, я хотів би запропонувати альтернативу. Проблема з поєднанням числових і деяких рядкових значень у стовпці не з заміною рядків на np.nan, а з тим, щоб зробити цілий стовпець належним. Б'юся об заклад, що оригінальний стовпець, швидше за все, має тип об'єкта

Name: y, dtype: object

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

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

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

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

Name: y, dtype: float64

10

Ви можете використовувати заміну:

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 - Replace


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

Це вирішить вашу проблему. За допомогою подвійного [] ви працюєте над копією DataFrame. Вам потрібно вказати точне місце розташування в одному дзвінку, щоб мати змогу змінити його.


0

Ви можете спробувати ці фрагменти.

У [16]: mydata = {'x': [10, 50, 18, 32, 47, 20], 'y': ['12', '11', 'N / A', '13', ' 15 ',' Недоступно ']}
У [17]: df = pd.DataFrame (mydata)

У [18]: df.y [df.y == "Недоступно"] = np.nan

Вихід [19]: df 
    xy
0 10 12
1 50 11
2 18 NaN
3 32 13
4 47 15
5 20 NaN

0

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.