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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 21:57:10