Панды заменяют значения в кадре данных условно на основе сравнения строк - PullRequest
0 голосов
/ 17 декабря 2018

У меня есть датафрейм для панд, как показано ниже, с 3 столбцами.Я хочу сравнить каждый столбец, чтобы увидеть, соответствует ли значение определенной строке, и если да, заменить значение на NaN.

Например, если в столбце 1 фрейма данных есть 5 значений:

abcd
abcd
defg
abcd
defg

и если строка сравнения равна defg, конечный результат для столбца 1 во фрейме данных должен быть.

abcd
abcd
NaN
abcd
NaN

Ответы [ 4 ]

0 голосов
/ 17 декабря 2018

Существует множество решений ... Если вы хотите попрактиковаться с использованием лямбда-функций, вы всегда можете сделать ...

df['Col1'] = df.Col1.apply(lambda x: np.nan if x == 'defg' else x)

Результат:

0  abcd
1  abcd
2   NaN
3  abcd
4   NaN
Seconds:  0.0020899999999999253

Время обработкивероятно, немного медленнее, чем приведенные выше решения, хотя после некоторого модульного тестирования.

0 голосов
/ 17 декабря 2018

Вы можете использовать mask, это заменит 'defg' во всем кадре данных на NaN:

df.mask(df == 'defg')

Вывод:

      0
0  abcd
1  abcd
2   NaN
3  abcd
4   NaN

Вы можете сделать это для столбцатакже:

df['col1'].mask(df['col1'] == 'defg')

Или используйте замену, как подсказывает @pygo в своем решении

df['col1'].replace('defg',np.nan)
0 голосов
/ 17 декабря 2018

Использование встроенного решения Pandas. Использование метода replace в качестве метода регулярных выражений и вставки, чтобы сделать его постоянным в кадре данных, и использование Numpy для замены соответствующих значений на NaN.

import pandas as pd
import numpy as np

. Пример DataFrame:

df
   col1
0  abcd
1  abcd
2  defg
3  abcd
4  defg

Результат:

df['col1'].replace(['defg'], np.nan, regex=True, inplace=True)
   df
       col1
    0  abcd
    1  abcd
    2   NaN
    3  abcd
    4   NaN
0 голосов
/ 17 декабря 2018

Вы можете использовать numpy где для установки значений на основе логических условий:

import numpy as np
df["col_name"] = np.where(df["col_name"]=="defg", np.nan, df["col_name"])

Очевидно, замените col_name на любое фактическое имя столбца.

Альтернативой является использование панд .loc для изменения значений в кадре данных на месте:

df.loc[df["col_name"]=="defg", "col_name"] = np.nan
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...