Изменение типов данных столбцов данных pandas на основе шаблона с соответствующими именами столбцов в PYTHON - PullRequest
0 голосов
/ 08 октября 2018

У меня есть 2 фрейма данных.

  • Шаблон - я буду использовать типы данных из этого фрейма данных.
  • df - Я хочу изменить типы данных этого фрейма данных на основе шаблона.

Я хочу изменить типы данных второго кадра данных на основе первого.Предположим, у меня есть ниже фрейм данных, который я использую в качестве шаблона.

> template
id <- c(1,2,3,4)
a <- c(1,4,5,6)
b <- as.character(c(0,1,1,4))
c <- as.character(c(0,1,1,0))
d <- c(0,1,1,0)
template <- data.frame(id,a,b,c,d, stringsAsFactors = FALSE)

> str(template)
'data.frame':   4 obs. of  5 variables:
 $ id: num  1 2 3 4
 $ a : num  1 4 5 6
 $ b : chr  "0" "1" "1" "4"
 $ c : chr  "0" "1" "1" "0"
 $ d : num  0 1 1 0

Я ищу ниже вещи.

  • Чтобы привести типы данных шаблона быть точно такими же вdf.
  • В нем должны быть те же столбцы, которые есть в рамке шаблона.

** Примечание. Следует добавить дополнительные столбцы со всеми NA, если они недоступны в df.

> df
id <- c(6,7,12,14,1,3,4,4)
a <- c(0,1,13,1,3,4,5,6)
b <- c(1,4,12,3,4,5,6,7)
c <- c(0,0,13,3,4,45,6,7)
e <- c(0,0,13,3,4,45,6,7)
df <- data.frame(id,a,b,c,e)

> str(df)
'data.frame':   8 obs. of  5 variables:
 $ id: num  6 7 12 14 1 3 4 4
 $ a : num  0 1 13 1 3 4 5 6
 $ b : num  1 4 12 3 4 5 6 7
 $ c : num  0 0 13 3 4 45 6 7
 $ e : num  0 0 13 3 4 45 6 7

Желаемый выход-

> output
    id  a  b  c  d
    1  6  0  1  0 NA
    2  7  1  4  0 NA
    3 12 13 12 13 NA
    4 14  1  3  3 NA
    5  1  3  4  4 NA
    6  3  4  5 45 NA
    7  4  5  6  6 NA
    8  4  6  7  7 NA

> str(output)

'data.frame':   8 obs. of  5 variables:
 $ id: num  6 7 12 14 1 3 4 4
 $ a : num  0 1 13 1 3 4 5 6
 $ b : chr  "1" "4" "12" "3" ...
 $ c : chr  "0" "0" "13" "3" ...
 $ d : logi  NA NA NA NA NA NA ...

R РЕШЕНИЕ ПО @ Frank.

res = data.frame(
  lapply(setNames(,names(template)), function(x) 
    if (x %in% names(df)) as(df[[x]], class(template[[x]])) 
    else template[[x]][NA_integer_]
  ), stringsAsFactors = FALSE)

ПРИМЕЧАНИЕ- Я пытаюсь сделать то же самое в Python.Я новичок в Python и понятия не имею, как подойти.Любая помощь будет по достоинству оценена.

1 Ответ

0 голосов
/ 08 октября 2018

Ваша проблема не может быть решена в общем случае, потому что в пандах нет integer NaN и booleane NaN (numpy).Для хранения NaN необходимо повысить типы данных https://pandas.pydata.org/pandas-docs/stable/gotchas.html#support-for-integer-na. Вы можете сделать это следующим образом:

import numpy as np
import pandas as pd

TEMPLATE = pd.DataFrame(
    {'id': pd.Series(dtype=int),
     'a': pd.Series(dtype=int),
     'b': pd.Series(dtype=str),
     'c': pd.Series(dtype=str),
     'd': pd.Series(dtype=bool)})


def modify_with_template(df, template):

    # type promotion
    df_dtypes = df.dtypes.to_dict()
    t_dtypes = template.dtypes.to_dict()

    to_promote_int = {
        col: np.float_
        for col in set(t_dtypes.keys()).difference(df_dtypes.keys())
        if issubclass(t_dtypes[col].type, np.integer)}
    to_promote_bool = {
        col: np.object_
        for col in set(t_dtypes.keys()).difference(df_dtypes.keys())
        if t_dtypes[col].type is np.bool_}

    t_dtypes.update(to_promote_int)
    t_dtypes.update(to_promote_bool)

    # actual modifying
    return df.reindex(template.columns, axis=1).astype(t_dtypes)


df = pd.DataFrame({'id': ['1', '0', '1']})
print(df)
df = modify_with_template(df, TEMPLATE)
print(df)

Вывод:

  id
0  1
1  0
2  1
    a    b    c    d  id
0 NaN  NaN  NaN  NaN   1
1 NaN  NaN  NaN  NaN   0
2 NaN  NaN  NaN  NaN   1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...