如何用数值替换分类值?

时间:2018-07-18 07:01:44

标签: python pandas

在数据框中,所有值的类型均为object,例如:>20<1>5等。 上限= 35和下限= 0因此,如果列中的值为<1,那么我想通过取平均值来替换该值,即(0(下限值)+1)/ 2 = 0.5

类似地,如果值是>20,那么我想用(20 + 35(upperbound value))/ 2 = 27.5替换该值

如何将现有数据框转换为所需格式。注意:col1中的值是字符串,而不是数字值。

现有数据框:

d = {'col1': ['>20', '<5', '<1','>10']}
df = pd.DataFrame(data=d)
df
      col1  
0     >20     
1     <5
2     <1
3     >10
4     100-200
5     10-20

我想将df以上的内容转换为:

      col1  
0     27.5     <--- (20+35)/2
1     2.5      <--- (5+0)/2
2     0.5      <--- (1+0)/2
3     22.5     <--- (10+35)/2
4     150      <--- (100+200)/2
5     15       <--- (10+20)/2

2 个答案:

答案 0 :(得分:2)

在子串中使用replace,然后在pandas.eval中使用

df['col2'] = pd.eval(df['col1'].replace(['>','<'], ['35+','0+'], regex=True)) / 2
print (df)
  col1  col2
0  >20  27.5
1   <5   2.5
2   <1   0.5
3  >10  22.5

编辑:

df['col2'] = pd.eval(df['col1'].replace(['>','<','-'], ['35+','0+','+'], regex=True)) / 2
print (df)
      col1  col2
0      >20  27.5
1       <5   2.5
2       <1   0.5
3      >10  22.5
4  100-200   150
5    10-20    15

编辑:

上面的Probl解决方案是它只能工作到100行(请参阅bug),因此需要替代解决方案:

df = pd.read_csv('train_jqd04QH(1).csv', usecols=['experience', 'company_size'])


s1 = df['experience'].replace(['>','<', '-'], ['35+','0+', '+'], regex=True)

#added anothr repalce string, `\+$` is match last + like 1000+
s2 = df['company_size'].replace(['>','<', '-', '/', '\+$'], 
                                ['35+','0+', '+', '+', '+35'], regex=True)

df['experience'] = s1.str.split('+', expand=True).astype(float).mean(axis=1)
df['company_size'] = s2.str.split('+', expand=True).astype(float).mean(axis=1)

print (df.head())

   experience  company_size
0         3.0         300.0
1        14.0           5.0
2         6.0          74.5
3        14.0          74.5
4         8.0           NaN

答案 1 :(得分:0)

您可以使用pd.DataFrame.replace

df.replace({'>20':27.5, '<5':2.5, '<1':0.5, '>10':22.5})

尽管我感觉要填充的值计算得不好。范围是否不如下:

20 - 35 --> 27.5
10 - 20 --> 15
1  -  5 --> 3
0  -  1 --> 0.5