【问题标题】:Use eval function with 'mean()' and 'median()'使用带有 'mean()' 和 'median()' 的 eval 函数
【发布时间】:2021-08-30 08:55:39
【问题描述】:

我想计算数据帧的平均值和中位数,所以我将它们放在一个列表中,如下所示:

comb_methods = ['median','mean']

我使用循环并使用 eval 函数使函数可调用,并计算结果并将其作为新列添加到数据框

for combin in comb_methods:
 combination = eval(combin)
 heartdata[combin] = heartdata.combination(axis=1)

我收到以下错误。

名称“中位数”未定义

我试图理解为什么这会持续几个小时,但我无法弄清楚!

【问题讨论】:

  • eval 评估输入字符串,就像它是代码一样;只是将“中位数”放在某处不是有效的 Python 命令
  • @ifly6 这就是我要找的!使用均值或中值作为可调用对象,当我简单地使用 heartdata['mean'] = heartdata.mean(axis=1) 时,它工作得很好

标签: python pandas


【解决方案1】:

您需要使用getattr 而不是eval

for combin in comb_methods:
    heartdata[combin] = getattr(heartdata, combin)(axis=1)

getattr 查找名称为字符串的给定对象的属性。写作

getattr(heartdata, 'median')

返回 heartdata.median(然后我们使用 axis=1 参数调用的方法)。

eval 另一方面,只是评估你传递给它的任何字符串。所以

eval('median')

与在 Python 脚本上简单地键入 median(不带引号)相同。 Python 会认为median 是一个变量,当找不到该变量时会抛出你看到的错误。

【讨论】:

  • 虽然如果你要在循环中修改列,请注意后续操作将使用所有列来计算结果统计,包括列) 你在循环本身中添加了。这会弄乱你的结果,所以我建议你先计算列,将它们存储在一个结构中(例如dict),然后再将它们添加到数据框中。
  • @MustafaAydın 感谢提醒,已修复
  • 我的错!我从@jfaccioni 的答案中复制了前两行代码,用 getattr 而不是 getattr 没有验证!谢谢大家,它正在工作
  • 感谢@jfaccioni 的评论,我真的错过了这个重要的细节!!!
猜你喜欢
  • 2021-06-24
  • 1970-01-01
  • 2012-09-27
  • 1970-01-01
  • 1970-01-01
  • 2011-04-25
  • 2014-04-18
  • 2013-04-24
  • 2013-04-26
相关资源
最近更新 更多