如何通过apply批量处理Pandas DataFrame字符串以执行pd.eval()
解决Pandas DataFrame批量转换数值的问题
嘿,我明白你的困扰——单个值或者单列处理没问题,但要把转换规则应用到整个DataFrame就卡壳了对吧?别担心,这里有几个实用的解决方案,根据你的数据类型选就行:
方法1:用applymap遍历所有元素(通用型,适配字符串/数值类型)
如果你的DataFrame里的数值是字符串类型,或者不确定数据类型,先定义一个转换函数,再用applymap把它应用到每一个元素上:
import pandas as pd # 假设你的原始DataFrame是df def convert_value(x): # 先转成字符串,确保能按位置拆分 x_str = str(x) # 拆分后直接做数学运算,比pd.eval更高效 prefix = int(x_str[:3]) suffix = int(x_str[3:]) return prefix + suffix / 320 # 应用到整个DataFrame df_converted = df.applymap(convert_value)
测试一下:2007-01-02的open值107155会被转换成107 + 155/320 = 107.484375,完全符合你的要求。
方法2:向量运算(高效型,适配整数类型)
如果你的DataFrame里的数值是整数类型(比如107155是int而非字符串),那直接用Pandas的向量运算会快很多——不用遍历每个元素,直接对整个DataFrame做数学操作:
# 提取前三位:通过整除1000实现 prefix = df // 1000 # 提取后三位:通过取模1000实现 suffix = df % 1000 # 按规则合并计算 df_converted = prefix + suffix / 320
这个方法的优势在于完全利用了Pandas的向量化特性,处理大数据集的时候比applymap快好几倍,而且代码更简洁。
为什么之前直接用规则不行?
你之前的规则pd.eval(x[:3] + '+' + x[3:] + '/320')只对单个元素有效,因为x[:3]这种字符串切片操作是针对单个值的,直接对整个DataFrame使用时,Pandas无法自动对每个元素单独处理——而applymap就是专门解决“对每个元素应用自定义函数”的场景,向量运算则是更高效的替代方案。
内容的提问来源于stack exchange,提问作者steff
相关产品推荐
相关产品推荐

