Лучший способ создать новые столбцы чисел на основе разных строковых значений в разных столбцах? - PullRequest
0 голосов
/ 08 октября 2019

У меня есть 5 различных возможных строковых значений в 3 столбцах, которые я хочу преобразовать в числовые значения в 3 новых столбцах.

Columns:
1_month, 6_month, 12_month

Possible Values:
High
Above Average
Average
Below Average
Low

I'd like to create 3 new columns:
1_month_int, 6_month_int, 12_month_int

Then map the numerics from the string values as:
High = 5
Above Average = 4
Average = 3
Below Average = 2
Low = 1

Я попытался скопировать столбец, затем найти и заменить значения для одногостолбец, затем, когда закончите, измените тип столбца на числовой. Это работает, но работает только для 1 столбца:

df['1_month_int'] = df['1_month']
df['1_month_int'].replace("High",5, inplace=True)
df['1_month_int'].replace("Above Average",4, inplace=True)
df['1_month_int'].replace("Average",3, inplace=True)
df['1_month_int'].replace("Below Average",2, inplace=True)
df['1_month_int'].replace("Low",1, inplace=True)
df['1_month_int'] = pandas.to_numeric(df['1_month_int'])

Я не могу заставить его работать сразу для нескольких столбцов:

df['1_month_int'] = df['1_month']
df['6_month_int'] = df['6_month']
df['12_month_int'] = df['12_month']
df[['3_month_int', '6_month_int', '12_month_int']/
      .replace("High",5, inplace=True)
etc..

Я уверен, что есть лучший способ.

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

Я был бы очень признателен за любую помощь, направленную в правильном направлении на лучшихпрактики для обработки данных, как это в Pandas.

Ответы [ 2 ]

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

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

import numpy as np
import pandas as pd

values = ["High", 
"Above Average", 
"Average", 
"Below Average", 
"Low", ]

mapper = {key: i+1 for i, key in enumerate(values[::-1])}

columns = "1_month,6_month,12_month".split(",")
df = pd.DataFrame(np.random.choice(values,(10,3)), columns=columns)

for col in columns:
    df[f"{col}_int"] = df[col].map(mapper)

display(df)
0 голосов
/ 08 октября 2019
  • вы можете использовать Series.map.
import pandas as pd
df = pd.DataFrame({
    '1_month':['High', 'Above Average'], '6_month':['Average','Below Average'], '12_month':['Low','Low']
})
map_ = {'High' : 5,'Above Average' : 4,'Average' : 3,'Below Average' : 2,'Low' : 1}
for c in df.columns:
    df[c+'_int'] = df[c].map(lambda x: map_[x])
df
  • выход
    1_month         6_month     12_month    1_month_int     6_month_int     12_month_int
0   High            Average         Low         5                3             1
1   Above Average   Below Average   Low         4                2             1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...