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() неправильно? Или есть лучший способ сделать условную замену значений?
Ответы
Ответ 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