Pandas数据框中浮点数列转换为百分比样式错误

6
我正在尝试将pandas数据框中的浮点数列转换为百分比格式。
C
0.9977
0.1234
1.000
..

为了

C
99.77%
12.34%
100%
...

为了实现这个目标,我正在执行以下操作:
df['C'] = df['C'].map(lambda n: '{:.2%}'.format(n))

但是我遇到了以下错误:

ValueError: Unknown format code '%' for object of type 'str'

我也尝试使用相同的代码'{:,.2%}',但出现了相同的错误...

我做错了什么吗?

2个回答

21

首先通过astype将列转换为浮点数:

df['C'] = df['C'].astype(float).map(lambda n: '{:.2%}'.format(n))

解决方案也应该更简化:

df['C'] = df['C'].astype(float).map("{:.2%}".format)

编辑:

问题是某些列中含有非数字的值。


将非数字替换为0

print (df)
                  C
0            0.9977
1            0.1234
2  Covered fraction
df['C'] = pd.to_numeric(df['C'], errors='coerce').fillna(0).map("{:.2%}".format)
print (df)
        C
0  99.77%
1  12.34%
2   0.00%

或者删除这些值所在的行:

df['C'] = pd.to_numeric(df['C'], errors='coerce')
df = df.dropna(subset=['C'])
df['C'] = df['C'].astype(float).map("{:.2%}".format)
print (df)
        C
0  99.77%
1  12.34%

这个解决方案也不起作用。我得到了以下错误:ValueError: could not convert string to float: Covered fraction - Solar
简化版正在正常运作。 - Ozgur

5

您还可以使用df.style

df.style.format({'C': '{:.2%}'})

如果您的序列数据类型没有问题,并且想将其用作字符串,请尝试:
df['C'] = df.C.apply(lambda x: f"{x[:x.find('.')+3]}%")
df
    C
0   0.99%
1   0.12%
2   1.00%

或者,如果使用Python版本低于3.6:

df['C'] = df.C.apply(lambda x: x[:x.find('.')+3]+'%')

使用Jezrael的方法将字符串转换为数字列,无效字符串转换为0:

df['C'] = pd.to_numeric(df['C'], errors='coerce').fillna(0)
df.style.format({'C': '{:.2%}'})

1
style.format也不起作用,执行时什么都没有发生 :/ - Solar
你的数据类型是字符串吗? - Mohit Motwani
1
@MohitMotwani - 谢谢,这是匿名的,所以我很好奇 :) - jezrael

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接