Я заядлый пользователь R и изучаю Python по пути.Один из примеров кода, который я могу легко запустить в R, ставит меня в тупик на Python.
Вот исходные данные (построенные в R):
library(tidyverse)
df <- tribble(~name, ~age, ~gender, ~height_in,
"john",20,'m',66,
'mary',NA,'f',62,
NA,38,'f',68,
'larry',NA,NA,NA
)
Вывод этого выглядит следующим образом:
df
# A tibble: 4 x 4
name age gender height_in
<chr> <dbl> <chr> <dbl>
1 john 20 m 66
2 mary NA f 62
3 NA 38 f 68
4 larry NA NA NA
Я хочу сделать 3 вещи:
- Я хочу заменить значения NA в столбцах, которые являются символами, значением "zz"
- Я хочу заменить значения NA в числовых столбцах значением 0
- Я хочу преобразовать символьные столбцы в коэффициенты.
Вот как я это сделал в R (снова, используя пакет tidyverse):
tmp <- df %>%
mutate_if(is.character, function(x) ifelse(is.na(x),"zz",x)) %>%
mutate_if(is.character, as.factor) %>%
mutate_if(is.numeric, function(x) ifelse(is.na(x), 0, x))
Вот вывод команды tmp:
tmp
# A tibble: 4 x 4
name age gender height_in
<fct> <dbl> <fct> <dbl>
1 john 20 m 66
2 mary 0 f 62
3 zz 38 f 68
4 larry 0 zz 0
Я знаком с операторами if () и else () в Python.То, что я не знаю, это правильный и самый читаемый способ выполнения вышеуказанного кода в Python.Я предполагаю, что в пакете pandas нет эквивалента mutate_if.Мой вопрос заключается в том, что представляет собой аналогичный код, который я могу использовать в python, который имитирует функции mutate_if, is.character, is.numeric и as.factor, найденные в tidyverse и R?
.Меня не так интересует скорость / эффективность выполнения кода, а скорее удобочитаемость - вот почему мне очень нравится Tidyverse.Буду признателен за любые советы или предложения.
Редактировать 1: добавление кода для создания кадра данных pandas
Вот код, который я использовал для создания кадра данных в Python,Это может помочь другим начать работу.
import pandas as pd
import numpy as np
my_dict = {
'name' : ['john','mary', np.nan, 'larry'],
'age' : [20, np.nan, 38, np.nan],
'gender' : ['m','f','f', np.nan],
'height_in' : [66, 62, 68, np.nan]
}
df = pd.DataFrame(my_dict)
Вывод должен быть похожим:
print(df)
name age gender height_in
0 john 20.0 m 66.0
1 mary NaN f 62.0
2 NaN 38.0 f 68.0
3 larry NaN NaN NaN