熊猫在带有数字和字符串的列中应用小数

时间:2018-08-27 12:45:52

标签: python pandas decimal apply series

我有一列包含数字和字符串。例如:

Result:
Failed
8.05
9
7

如何更改数据以显示两位小数,即如下?

Result:
Failed
8.05
9.00
7.00

我正在尝试以下操作,但不起作用。谢谢你的帮助!

df['Result'] =  df['Result'].apply('{:.2f}'.format)

2 个答案:

答案 0 :(得分:2)

我认为需要创建布尔掩码:

#numeric with strings
df = pd.DataFrame({'Result':['Failed',8.05,9,7]})

mask = pd.to_numeric(df['Result'], errors='coerce').notnull()
df.loc[mask, 'Result'] =  df.loc[mask, 'Result'].apply('{:.2f}'.format)
print (df)
0  Failed
1    8.05
2    9.00
3    7.00

如果需要所有字符串,请首先将其强制转换为float

df = pd.DataFrame({'Result':['Failed','8.05','9','7']})

mask = pd.to_numeric(df['Result'], errors='coerce').notnull()
df.loc[mask, 'Result'] =  df.loc[mask, 'Result'].astype(float).apply('{:.2f}'.format)
print (df)
   Result
0  Failed
1    8.05
2    9.00
3    7.00

答案 1 :(得分:1)

您可以将pd.Series.apply与三元表达式一起使用:

s = pd.Series(['Failed', 8.05, 9, 7])

s =  s.apply(lambda x: f'{x:.2f}' if not isinstance(x, str) else x)

print(s)

0    Failed
1      8.05
2      9.00
3      7.00
dtype: object

请注意,在混合数字和非数字类型时,不建议您使用这种结构来构造数据。另外,您将数字数据存储为字符串,这很昂贵。