pandas读取CSV时如何移除%并将字符串列转换为浮点型
读取CSV时自动转换带百分号的列为浮点型
问题描述
CSV文件中ChangeP列存储格式为带%后缀的字符串,例如"6.45%",同时存在"-1.23%"这类负值字符串。需要在读取文件的环节就完成整列的百分号移除、浮点类型转换,方便后续直接做数值比较、计算操作。
直接指定dtype读取的写法会抛出报错:
df = pd.read_csv('spxweekly.csv', dtype={'ChangeP':float}) print(df.dtypes)
报错信息:
ValueError: could not convert string to float: '6.45%'
目前仅能在读取完成后通过字符串替换+类型转换实现处理,无法在读取环节一步完成:
bigmove = df.loc[df['ChangeP'] > "5"] print(bigmove.ChangeP.str.replace('%', '').astype(float))
实现方法
调用pd.read_csv时传入converters参数,为ChangeP列指定转换逻辑,读取环节就能一步完成处理,代码如下:
df = pd.read_csv( "spxweekly.csv", converters={"ChangeP": lambda val: float(val.strip("%"))} )
逻辑说明
converters参数接收字典格式的配置,键为列名,值为作用在该列每一个值上的转换函数,会在解析CSV时直接执行,无需读取后二次处理val.strip("%")只会移除字符串首尾的%符号,不会破坏负号、小数点的位置,负值字符串可以正常转换为对应负浮点数- 转换完成后
ChangeP列直接为float类型,后续数值筛选、计算可以直接调用,比如筛选涨跌幅大于5的行直接写df[df["ChangeP"] > 5]即可 - 如果业务上需要把百分比转为0-1区间的比例值,只需要把转换逻辑调整为
lambda val: float(val.strip("%")) / 100,6.45%就会被转换为0.0645。
内容的提问来源于stack exchange,提问作者jordyj99
相关产品推荐
相关产品推荐

