基于不同列中不同字符串值创建数字新列的最佳方法?

时间:2019-10-08 17:17:49

标签: python pandas dataframe

我希望将3列中的5种不同的字符串值转换为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..

我相信有更好的方法。

我对熊猫很陌生,并且正在努力学习如何思考和解决这样的问题。

如果能在正确的方向上为在熊猫中处理此类数据的最佳实践提供帮助,我将不胜感激。

2 个答案:

答案 0 :(得分:0)

  • 您可以使用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

答案 1 :(得分:0)

您可以使用系列的映射功能将值映射到给定的数字,如下所示

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)