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

如何为Series的getattr调用传入带参数的条件测试元组?

这个问题我之前也碰到过,直接传'lt(5)'这种带括号的字符串肯定行不通,因为getattr只能识别纯方法名,没法自动解析括号里的参数。给你两个实用的解决方案:

方案1:用嵌套元组存储方法名+参数

把你的tests改成包含元组的结构,每个元组里存方法名和对应的参数,比如:

tests = (('lt', 5), ('lt', 2), ('gt', 9))

然后修改列表推导式,循环的时候把方法名和参数拆出来,再调用对应的方法:

deltas = [
    getattr(test_df.diff().cumsum()[col], test_name)(threshold).cumsum()
    for col, (test_name, threshold) in zip(test_df.columns, tests)
]

这种方式很直观,适合你这种需要调用pandas内置比较方法(lt/gt/le/ge等)的场景,参数也可以扩展成多个(比如如果有需要传多个参数的方法,把元组里的元素加多就行)。

方案2:用Lambda表达式封装自定义逻辑

如果你的测试逻辑更复杂(比如不止是简单的数值比较),可以直接把tests写成lambda函数的列表,把每个测试逻辑直接封装进去:

tests = [
    lambda s: s.lt(5),
    lambda s: s.lt(2),
    lambda s: s.gt(9)
]

对应的列表推导式就更简洁了,直接调用lambda函数即可:

deltas = [
    test(test_df.diff().cumsum()[col]).cumsum()
    for col, test in zip(test_df.columns, tests)
]

这种方式的优势是灵活性极强——你可以在lambda里写任意逻辑,比如s.lt(5) & s.gt(1)这种多条件组合,甚至调用自定义函数。

举个完整的示例

假设我们有这样的测试DataFrame:

import pandas as pd
test_df = pd.DataFrame({
    'A': [1, 3, 6, 2, 7],
    'B': [0, 1, 3, 5, 8],
    'C': [10, 8, 12, 15, 7]
})

用方案1的代码运行后,就能得到每个列对应测试的累计结果,完全符合你的需求。

内容的提问来源于stack exchange,提问作者John

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 09:54:59