如何用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
相关产品推荐
相关产品推荐

