在Pandas中优雅高效实现字符串到数值映射的最优方法(AA/AB/BB规则)
在Pandas中优雅高效地将字符串编码为数值的方法
针对你提出的字符串编码需求,**pandas.DataFrame.replace()**是比apply()更高效优雅的实现方式——它基于矢量化操作,避免了apply()系列方法的逐元素/逐行循环,性能提升明显。以下是具体实现方案:
方法一:使用replace()进行矢量化映射
先定义映射字典,直接传入replace()即可完成全表的批量替换,代码简洁且效率最高:
import pandas as pd table_input = pd.DataFrame({'Col1': ["AB", "BB"], 'Col2': ["AA", "AB"]}, index=['Sample1', 'Sample2']) table_output = pd.DataFrame({'Col1': [0.5, 1.0], 'Col2': [0.0, 0.5]}, index=['Sample1', 'Sample2']) # 定义映射规则 mapping = {'AA': 0.0, 'AB': 0.5, 'BB': 1.0} # 执行替换 table_result = table_input.replace(mapping) # 验证结果是否符合预期 print(table_result.equals(table_output)) # 输出 True
方法二:使用applymap()配合字典映射
如果需要更灵活的元素级处理(比如处理未在映射中的值),可以用applymap()调用字典的get()方法,性能略逊于replace()但仍优于普通apply():
# 执行元素级映射,未匹配值可设置默认值(这里设为NaN) table_result = table_input.applymap(lambda x: mapping.get(x, pd.NA))
效率对比
replace():底层基于Pandas的矢量化引擎实现,处理大表时速度比apply()快数倍甚至数十倍。applymap():虽然是逐元素处理,但比逐行的apply()更简洁高效。- 普通
apply():逐行/逐列循环处理,性能最差,不推荐用于大规模数据。
内容的提问来源于stack exchange,提问作者Pm740
相关产品推荐
相关产品推荐

