【问题标题】:apply multiple lambda functions with parameter in pandas在 pandas 中应用多个带参数的 lambda 函数
【发布时间】:2022-01-27 01:08:01
【问题描述】:

我在 pandas DataFrame 中找到高于某些截止值的某些值的索引。到目前为止,我已经使用一系列 lambda 函数实现了这一点。

data.apply([lambda v:v[v>=0.25].idxmin(),
                                 lambda v:v[v>=0.25].idxmin(),
                                 lambda v:v[v>=0.50].idxmin(),
                                 lambda v:v[v>=0.75].idxmin(),
                                 lambda v:v[v>=0.90].idxmin()])

我试图将 lambda 函数参数化为任意截止值列表。但是,如果我使用以下内容,则结果不正确,因为所有 lambda 函数都具有相同的名称,并且基本上只有最后一个存在于 apply 返回的数据框中。 如何正确参数化这些 lambda?

 cutoff_values=[25,50,100]
 agg_list=[lambda v,c:v[v>=(float(c)/100.0)].idxmin() for c in cutoff_values]
 data.apply(agg_list)

pythonic-pandasque 更好的方法是什么?

【问题讨论】:

  • 您使用多个 lambda 而不是函数是否有特定原因?也许你能详细说明my cutoff list is changing
  • 命名函数会有什么不同吗?
  • 关于我的截止列表正在改变:我需要设置我的截止参数
  • 有了一个函数,只需传递一组截止值而不是复制和粘贴 lambda 函数会容易得多。并且使用命名函数,您不会遇到只执行最后一个函数的问题。在那里,您可以在一个功能中完成所有操作。或者像 @jezrael 在答案中使用嵌套的 lambdas

标签: python pandas lambda


【解决方案1】:

对我来说,使用嵌套的 lambda 函数,例如:

q = lambda c: lambda x: x[x>=c].idxmin()
cutoff_values=[25,50,90]
print (data.apply([q((float(c)/100.0)) for c in cutoff_values]))

【讨论】:

    【解决方案2】:

    你可以用这个:

    df = pd.DataFrame(data={'col':[0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9]})
    df = df[['col']].apply(lambda x: [x[x >= (float(c) / 100.0)].idxmin() for c in cutoff_values])
    

    【讨论】:

      猜你喜欢
      • 2021-05-27
      • 2019-06-28
      • 1970-01-01
      • 2020-12-07
      • 1970-01-01
      • 2018-05-13
      • 2021-01-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多