Pandas技巧:如何向apply函数传入指定多列的值?
解决DataFrame仅传入指定列到apply函数的问题
当DataFrame列数众多但仅需处理特定列时,无需传递整行数据,以下两种方案可以高效解决你的需求:
方案一:筛选指定列后使用apply
先提取目标列生成子DataFrame,再对其调用apply,这样每行仅会传入指定列的数据,同时优化函数逻辑使其更通用:
import re import pandas as pd from pandas import Series regex = re.compile(r'(\d+)kg') def find_weight(row: Series) -> int | None: # 遍历传入的目标列值,找到第一个匹配的重量 for val in row: result = re.search(pattern=regex, string=str(val)) if result: return int(result.group(1)) return None df = pd.DataFrame([['some string', '2kg.'], ['got 5kg', 'some string'], ['some string', 'some string']], columns=['str1', 'str2']) # 指定需要检查的列 target_cols = ['str1', 'str2'] # 仅将目标列的行数据传入函数 df['weight'] = df[target_cols].apply(find_weight, axis=1) print(df)
这样修改后,后续只需调整target_cols的内容,就能适配不同的目标列,无需改动函数内部逻辑。
方案二:使用矢量化操作(更高效)
对于提取匹配值的场景,利用pandas的矢量化方法替代apply,性能会大幅提升(尤其适合大数据量):
import pandas as pd df = pd.DataFrame([['some string', '2kg.'], ['got 5kg', 'some string'], ['some string', 'some string']], columns=['str1', 'str2']) target_cols = ['str1', 'str2'] # 对目标列提取数字,按行向后填充NaN,取第一个有效结果 df['weight'] = ( df[target_cols] .apply(lambda col: col.str.extract(r'(\d+)kg', expand=False)) .bfill(axis=1) .iloc[:, 0] .astype('Int64') # 转为支持空值的整数类型 ) print(df)
原理是先通过str.extract从每个目标列中提取重量数字,再用bfill(axis=1)按行从左到右填充空值,最后取每行的第一个有效结果,全程无需自定义函数,依赖pandas原生的高效操作。
内容的提问来源于stack exchange,提问作者Recently_Created_User
相关产品推荐
相关产品推荐

