如何用if语句处理带m/Th单位的字符串转整数,解决替换不全与float迭代报错
问题分析
- 关于
TypeError: argument of type 'float' is not iterable报错:你的猜测不对,该报错是因为DataFrame中存在空值(NaN属于float类型),直接对float类型执行"m" in i的包含判断时,float不可迭代,因此触发报错,和小数带m的格式无关。 - 关于m前缀适配问题:你最初的替换逻辑仅匹配
.00m后缀,修改后的正则逻辑会丢失小数点的位数信息,例如£1.2m会被提取为12,乘以10000得到120000,和正确值1200000相差10倍,逻辑存在问题。
修正后代码
批量处理版本(适配你原有的输入格式)
import re import numpy as np def convert_currency_to_int(x): data = [] for i in x: # 先处理非字符串/空值情况,避免报错 if not isinstance(i, str): # 可根据需求替换为0或者其他默认值 data.append(np.nan) continue # 正则匹配数值部分(支持整数、小数、开头带小数点的格式)和单位 match_res = re.search(r'([\d]*\.?\d+)(m|Th\.)', i) if not match_res: # 未匹配到有效单位的场景,可自定义处理逻辑 data.append(np.nan) continue val = float(match_res.group(1)) unit = match_res.group(2) if unit == 'm': res = int(val * 1000000) elif unit == 'Th.': res = int(val * 1000) data.append(res) return data
DataFrame 专用版本(更适合大表批量处理)
import re import numpy as np def convert_single_currency(i): if not isinstance(i, str): return np.nan match_res = re.search(r'([\d]*\.?\d+)(m|Th\.)', i) if not match_res: return np.nan val = float(match_res.group(1)) return int(val * 1000000) if match_res.group(2) == 'm' else int(val * 1000) # 使用示例,直接对指定列做转换即可 # df['转换后整数字段'] = df['原货币字段'].apply(convert_single_currency)
测试验证
# 测试数据包含.50m格式、空值等场景 data_array = np.array(['£67.50m', '£63.00m', '£49.50m','£90Th.', '£720Th.', '£.50m', '£1.2m', np.nan], dtype=object) print(convert_currency_to_int(data_array))
输出结果:[67500000, 63000000, 49500000, 90000, 720000, 500000, 1200000, nan]
适配范围:
- 自动跳过空值/非字符串类型数据,解决TypeError报错
- 支持任意小数格式的m单位匹配,包括
.50m这类开头带小数点的场景 - 自动过滤货币符号,不需要额外替换£等特殊符号
- 数值计算逻辑准确,不会出现位数错位问题
内容的提问来源于stack exchange,提问作者me.limes
相关产品推荐
相关产品推荐

