如何在Pandas中对多列同时使用apply函数?
在Pandas中对多列使用apply函数的方法
当然可以在Pandas里对多列调用apply函数!不过你提供的代码有两处需要调整的细节,我会一步步帮你梳理正确的实现方式,满足你生成Duration列的需求。
一、用apply处理多列的核心要点
默认情况下,apply是按列执行运算的,如果你需要同时处理一行里的多列数据,必须指定axis=1参数(表示按行遍历)。另外,选取多列时要使用双层方括号[['列名1', '列名2', '列名3']],单层方括号会导致索引错误。
正确代码示例
先导入必要的库并构造测试数据:
import pandas as pd from datetime import timedelta # 示例数据集 df = pd.DataFrame({ 'Hours': [1, 2, 0], 'Mins': [30, 15, 45], 'Secs': [45, 20, 10] })
方式1:通过列名调用(可读性更高)
直接在lambda函数里通过行对象的列名取值,逻辑更清晰:
df['Duration'] = df[['Hours', 'Mins', 'Secs']].apply( lambda row: timedelta(hours=row['Hours'], minutes=row['Mins'], seconds=row['Secs']), axis=1 )
方式2:通过位置参数调用(更简洁)
如果想用你最初写的x,y,z参数形式,可以把行转成列表后解包:
df['Duration'] = df[['Hours', 'Mins', 'Secs']].apply( lambda row: timedelta(*row.tolist()), # 解包行数据为三个参数 axis=1 )
二、更高效的替代方案:矢量化操作
apply本质是逐行循环,数据量大时效率会偏低。Pandas提供了矢量化的pd.to_timedelta方法,速度更快:
df['Duration'] = pd.to_timedelta(df['Hours'], unit='h') + \ pd.to_timedelta(df['Mins'], unit='m') + \ pd.to_timedelta(df['Secs'], unit='s')
最终效果
运行代码后,你的DataFrame会生成目标列:
Hours Mins Secs Duration 0 1 30 45 0 days 01:30:45 1 2 15 20 0 days 02:15:20 2 0 45 10 0 days 00:45:10
内容的提问来源于stack exchange,提问作者Blank
相关产品推荐
相关产品推荐

