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

如何通过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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 07:09:18