Любые предложения приветствуются.
Ответ 1
pandas
также имеет метод replace
:
In [25]: df = DataFrame({1: [2,3,4], 2: [3,4,5]})
In [26]: df
Out[26]:
1 2
0 2 3
1 3 4
2 4 5
In [27]: df[2]
Out[27]:
0 3
1 4
2 5
Name: 2
In [28]: df[2].replace(4, 17)
Out[28]:
0 3
1 17
2 5
Name: 2
In [29]: df[2].replace(4, 17, inplace=True)
Out[29]:
0 3
1 17
2 5
Name: 2
In [30]: df
Out[30]:
1 2
0 2 3
1 3 17
2 4 5
или вы можете использовать numpy
-строчное расширенное индексирование:
In [47]: df[1]
Out[47]:
0 2
1 3
2 4
Name: 1
In [48]: df[1] == 4
Out[48]:
0 False
1 False
2 True
Name: 1
In [49]: df[1][df[1] == 4]
Out[49]:
2 4
Name: 1
In [50]: df[1][df[1] == 4] = 19
In [51]: df
Out[51]:
1 2
0 2 3
1 3 17
2 19 5
Ответ 2
Pandas doc для replace
не имеет примеров, поэтому я приведу некоторые из них. Для тех, кто идет с точки зрения R (как и я), replace
- это в основном универсальная функция замены, которая объединяет функциональность R-функций plyr::mapvalues
, plyr::revalue
и stringr::str_replace_all
. Поскольку DSM охватывает случай одиночных значений, я расскажу о многозначном случае.
Пример серии
In [10]: x = pd.Series([1, 2, 3, 4])
In [11]: x
Out[11]:
0 1
1 2
2 3
3 4
dtype: int64
Мы хотим заменить целые положительные числа отрицательными целыми числами (а не умножением на -1).
Два списка значений
Один из способов сделать это, имея один список (или pandas) значений, которые мы хотим заменить, и второй список со значениями, которые мы хотим заменить.
In [14]: x.replace([1, 2, 3, 4], [-1, -2, -3, -4])
Out[14]:
0 -1
1 -2
2 -3
3 -4
dtype: int64
Это соответствует plyr::mapvalues
.
Словарь значений пар
Иногда удобнее иметь словарь пар значений. Индекс - это тот, который мы заменяем, и значение - это тот, который мы заменим.
In [15]: x.replace({1: -1, 2: -2, 3: -3, 4: -4})
Out[15]:
0 -1
1 -2
2 -3
3 -4
dtype: int64
Это соответствует plyr::revalue
.
Строка
Он работает аналогично для строк, за исключением того, что у нас также есть возможность использовать шаблоны регулярных выражений.
Если мы просто хотим заменить строки другими строками, он работает точно так же, как и раньше:
In [18]: s = pd.Series(["ape", "monkey", "seagull"])
In [22]: s
Out[22]:
0 ape
1 monkey
2 seagull
dtype: object
Два списка
In [25]: s.replace(["ape", "monkey"], ["lion", "panda"])
Out[25]:
0 lion
1 panda
2 seagull
dtype: object
Словарь
In [26]: s.replace({"ape": "lion", "monkey": "panda"})
Out[26]:
0 lion
1 panda
2 seagull
dtype: object
Regex
Замените все a
на x
s.
In [27]: s.replace("a", "x", regex=True)
Out[27]:
0 xpe
1 monkey
2 sexgull
dtype: object
Замените все l
на x
s.
In [28]: s.replace("l", "x", regex=True)
Out[28]:
0 ape
1 monkey
2 seaguxx
dtype: object
Обратите внимание, что оба l
в seagull
были заменены.
Замените a
на x
и l
на p
s
In [29]: s.replace(["a", "l"], ["x", "p"], regex=True)
Out[29]:
0 xpe
1 monkey
2 sexgupp
dtype: object
В специальном случае, когда требуется заменить несколько разных значений одним и тем же значением, в качестве замены может быть просто одна строка. Он не должен находиться внутри списка. Замените a
и l
на p
s
In [29]: s.replace(["a", "l"], "p", regex=True)
Out[29]:
0 ppe
1 monkey
2 sepgupp
dtype: object
(Кредит DaveL17 в комментариях)