Эквивалентный код Python для mutate_if от tidyverse - PullRequest
0 голосов
/ 26 февраля 2019

Я заядлый пользователь 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 вещи:

  1. Я хочу заменить значения NA в столбцах, которые являются символами, значением "zz"
  2. Я хочу заменить значения NA в числовых столбцах значением 0
  3. Я хочу преобразовать символьные столбцы в коэффициенты.

Вот как я это сделал в 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

1 Ответ

0 голосов
/ 27 февраля 2019

Ну, после некоторого сна, я думаю, я понял это.

Вот код, который я использовал, чтобы взять кадр данных pandas и применить сопоставимые функции mutate_if, которые я упоминал ранее, чтобы получить те же результаты.

# fill in the missing values (similar to mutate_if from tidyverse)
df1 = df.select_dtypes(include=['double']).fillna(0)
df2 = df.select_dtypes(include=['object']).fillna('zz').astype('category')

df = pd.concat([df2.reset_index(drop = True), df1], axis = 1)

print(df)
    name gender   age  height_in
0   john      m  20.0       66.0
1   mary      f   0.0       62.0
2     zz      f  38.0       68.0
3  larry     zz   0.0        0.0

# check again for the data types
df.dtypes
name         category
gender       category
age           float64
height_in     float64
dtype: object

Проблема в том, что мне пришлось «разбить» исходный кадр данных, применить изменения (т.е. заполнить пропущенные значения и изменить типы данных), а затем рекомбинировать столбцы (т.е. поместить данныекадр вместе).

...