You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Pandas读取带逗号小数和百分号的CSV列并转为浮点数

问题描述

我需要读取如下格式的CSV文件:

Data1 [g/m3];Data2 [%]
9,46;94,2%
9,45;94,1%
9,42;93,8%

希望将Data2 [%]列读取为值为[94.2, 94.1, 93.8]的Pandas DataFrame浮点数列。目前我能在读后移除百分号,但这样无法使用read_csv(dec=",")将逗号转为小数点。请问是否可以在读取CSV时直接将这类数值转为浮点数,还是必须在读后对DataFrame进行处理?

以下是我当前使用的代码:

import pandas as pd
df = pd.read_csv(f, encoding="latin-1", sep=";", decimal=",")

for col in df:
    if str(df[col][0])[-1] == "%":
        df[col] = df[col].str.rstrip('%').str.replace(',', '.').astype('float')
解决方案

两种方式都能实现需求,既可以在读取阶段直接处理,也可以优化读后的转换逻辑:

方法一:读取时用converters参数直接转换

借助read_csv的converters参数,给目标列指定转换函数,读取时就完成百分号移除、小数点替换和类型转换:

import pandas as pd

def convert_percent_col(value):
    # 移除末尾百分号,替换逗号为小数点,转为浮点数
    return float(value.rstrip('%').replace(',', '.'))

df = pd.read_csv(
    f,
    encoding="latin-1",
    sep=";",
    decimal=",",  # 该参数仍对Data1这类纯数值列生效
    converters={"Data2 [%]": convert_percent_col}
)

这种方式无需后续额外处理,一步到位。

方法二:优化读后处理逻辑

你当前的代码逻辑可行,但可以简化判断条件,同时避免冗余操作:

import pandas as pd

df = pd.read_csv(f, encoding="latin-1", sep=";", decimal=",")

for col in df.columns:
    # 先判断列是否为字符串类型,再检查是否存在带百分号的数值
    if pd.api.types.is_string_dtype(df[col]) and df[col].str.endswith('%').any():
        df[col] = df[col].str.rstrip('%').str.replace(',', '.').astype(float)

注:如果需要将百分比转为小数(比如把94.2%转为0.942),可以在astype(float)后加上.div(100)。

为什么原代码中decimal=","不生效?

因为Data2 [%]列的每个值末尾带有%,Pandas会自动将该列识别为字符串类型,而decimal参数仅对被识别为数值类型的列生效,因此无法自动将逗号转为小数点,必须手动处理字符串内容后再转换类型。

内容的提问来源于stack exchange,提问作者FerventHippo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 20:42:02