如何对两个pandas Series应用双参数函数并返回Series结果
逐行对两个Pandas Series应用双参数函数的简洁实现
问题描述
现有两个Pandas Series对象:
s = pd.Series([20, 21, 12]) t = pd.Series([17, 19, 11])
需要将一个接收两个参数的函数逐行作用在这两个Series上,返回由逐行计算结果组成的新Series。目前已知的实现方式需要先拼接为DataFrame再做逐行apply:
df = pd.concat([s, t], axis=1) result = df.apply(lambda x: foo(x.iloc[0], x.iloc[1]), axis=1)
这种写法冗余度高,想要更简洁的实现方案。
最优方案
直接使用Pandas内置的Series.combine方法即可,无需提前拼接DataFrame,一行代码就能实现需求:
result = s.combine(t, foo)
该方法会自动按索引对齐两个Series,逐位将两个Series的对应值传入自定义函数foo的两个入参,直接返回计算完成的Series对象。
其他可选实现
- 如果自定义函数支持数组输入,优先直接传入两个Series做向量化运算,性能远高于逐行遍历的apply类方法。比如
foo是计算两数之和的函数,直接写result = foo(s, t)即可,Pandas会自动完成逐元素的广播计算。 - 如果不需要做索引对齐,仅按位置配对计算,可以直接用zip遍历两个Series,性能比DataFrame.apply更好:
记得手动绑定原Series的索引,避免出现索引错位问题。result = pd.Series([foo(a, b) for a, b in zip(s, t)], index=s.index)
提示:如果两个Series的索引不完全匹配,
combine和向量化运算默认会取两个索引的并集,缺失位置填充NaN后再传入函数;如果不需要索引对齐逻辑,zip遍历的方式更符合预期。
内容的提问来源于stack exchange,提问作者Igor Rivin
相关产品推荐
相关产品推荐

