首页 > 解决方案 > 对象类型列,百分比以 % 和十进制显示,全部转换为十进制

问题描述

我有一个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 转换为浮点数,但问题是上面的代码用 NaN 替换了已经有 '0.5' / 0.5000 的字段

标签: pythonpandas

解决方案


您可以使用to_numeric将所有没有百分比的值转换为浮点数,不可解析的值是NaNs,因此可以通过Series创建来替换它们Series.str.replace- 如果数据仅包含百分比和非百分比数字,则解决方案工作:

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

推荐阅读