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

Python pandas эквивалент для замены

В R существует довольно полезная функция replace. По сути, он выполняет условное перераспределение в заданном столбце кадра данных. Его можно использовать так: replace(df$column, df$column==1,'Type 1');

Каков хороший способ достичь того же в pandas?

Должен ли я использовать лямбда с apply? (Если да, то как мне получить ссылку на данный столбец, а не целую строку).

Должен ли я использовать np.where на data_frame.values? Кажется, что я пропускаю здесь очень очевидную вещь.

Любые предложения приветствуются.

4b9b3361

Ответ 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 в комментариях)