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

Pandas - замена значений столбца

Я знаю, что в этом вопросе есть несколько тем, но ни один из методов не работал у меня, поэтому я публикую о своей конкретной ситуации.

У меня есть dataframe, который выглядит так:

data = pd.DataFrame([[1,0],[0,1],[1,0],[0,1]], columns=["sex", "split"])
data['sex'].replace(0, 'Female')
data['sex'].replace(1, 'Male')
data

То, что я хочу сделать, это заменить все 0 в столбце пола на "Female", а все 1 - на "Male", но значения в кадре данных, похоже, не меняются, когда я использую код выше

Я использую replace() неправильно? Или есть лучший способ сделать условную замену значений?

4b9b3361

Ответ 1

Да, вы используете его некорректно, Series.replace() по умолчанию не работает в месте, он возвращает замененный dataframe/series, вам нужно назначить его обратно ваш dataFrame/Series для его эффекта. Если вам нужно сделать это на месте, вам нужно указать аргумент ключевого слова inplace как True Example -

data['sex'].replace(0, 'Female',inplace=True)
data['sex'].replace(1, 'Male',inplace=True)

Кроме того, вы можете объединить приведенное выше в один вызов функции replace, используя list для аргумента to_replace, а также для аргумента value, Example -

data['sex'].replace([0,1],['Female','Male'],inplace=True)

Пример/Демо -

In [10]: data = pd.DataFrame([[1,0],[0,1],[1,0],[0,1]], columns=["sex", "split"])

In [11]: data['sex'].replace([0,1],['Female','Male'],inplace=True)

In [12]: data
Out[12]:
      sex  split
0    Male      0
1  Female      1
2    Male      0
3  Female      1

Вы также можете использовать словарь, пример -

In [15]: data = pd.DataFrame([[1,0],[0,1],[1,0],[0,1]], columns=["sex", "split"])

In [16]: data['sex'].replace({0:'Female',1:'Male'},inplace=True)

In [17]: data
Out[17]:
      sex  split
0    Male      0
1  Female      1
2    Male      0
3  Female      1

Ответ 2

Вы также можете попробовать использовать apply с get методом dictionary, кажется, немного быстрее, чем replace:

data['sex'] = data['sex'].apply({1:'Male', 0:'Female'}.get)

Тестирование с помощью timeit:

%%timeit
data['sex'].replace([0,1],['Female','Male'],inplace=True)

Результат:

The slowest run took 5.83 times longer than the fastest. This could mean that an intermediate result is being cached.
1000 loops, best of 3: 510 µs per loop

Использование apply:

%%timeit
data['sex'] = data['sex'].apply({1:'Male', 0:'Female'}.get)

Результат:

The slowest run took 5.92 times longer than the fastest. This could mean that an intermediate result is being cached.
1000 loops, best of 3: 331 µs per loop