在数据框中,所有值的类型均为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
答案 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