我有一个df:
Percentage Purchased
0 50.00% 0
1 66.37% 1
2 50.00% 0
3 0.5 1
4 0.5000 1
“百分比”是对象类型,我希望最终结果是:
Percentage Purchased
0 0.5000 0
1 0.6637 1
2 0.5000 0
3 0.5000 1
4 0.5000 1
我尝试使用:
df['Percentage'] = dataset['Percentage'].str.replace(r'%', r'').astype('float')/100
首先要将百分比转换为浮点数,然后将整个df转换为浮点数,但是 问题是上述代码将Naf已经替换为'0.5'/ 0.5000的字段
答案 0 :(得分:2)
您可以使用to_numeric
将所有不带百分比的值转换为浮点数,不可解析的值是NaN
,因此可以用Series.str.replace
创建的Series
来替换它们-解决方案如果数据仅包含百分比数字和不包含百分比数字,则可以使用:
s = df['Percentage'].str.replace(r'%', r'').astype('float')/100
df['Percentage'] = pd.to_numeric(df['Percentage'], errors='coerce').fillna(s)
print (df)
Percentage Purchased
0 0.5000 0
1 0.6637 1
2 0.5000 0
3 0.5000 1
4 0.5000 1
另一种具有列表理解的解决方案,或者是apply
,其中测试了值的百分比:
df['Percentage'] = [float(x.replace('%', ''))/100
if '%' in x
else float(x) for x in df['Percentage']]
f = lambda x: float(x.replace('%', ''))/100 if '%' in x else float(x)
df['Percentage'] = df['Percentage'].apply(f)
print (df)
Percentage Purchased
0 0.5000 0
1 0.6637 1
2 0.5000 0
3 0.5000 1
4 0.5000 1
答案 1 :(得分:1)
这可能有帮助:
df['Percentage'] = df.Percentage.apply(lambda x: format(float(x.split('%')[0]), '.4f'))
print(df)
Percentage Purchased
0 0.5000 0
1 0.6637 1
2 0.5000 0
3 0.5000 1
4 0.5000 1