【问题标题】:How to using the .apply(lambda x: function) over all the columns of a dataframe如何在数据框的所有列上使用 .apply(lambda x: function)
【发布时间】:2021-09-22 15:25:50
【问题描述】:

我正在尝试使用apply(lamdba x:python中的函数)通过​​自定义函数传递数据帧的每一列。 我创建的自定义函数可以单独工作,但是当将其放入 apply(lamdba x: 结构时,只会将 NaN 值返回到选定的数据帧中。

首先是自定义函数-

def snr_pd(wavenumber_arr):
    intensity_arr = Zhangfit_output 
    signal_low = 1650
    signal_high = 1750
    noise_low = 1750
    noise_high = 1850

    signal_mask = np.logical_and((wavenumber_arr >= signal_low), (wavenumber_arr < 
    signal_high))
    noise_mask = np.logical_and((wavenumber_arr >= noise_low), (wavenumber_arr < noise_high))

    signal = np.max(intensity_arr[signal_mask])
    noise = np.std(intensity_arr[noise_mask])
    return signal / noise

这就是 lambda 函数的设置 -

sd['s/n'] = df.apply(lambda x: snr_pd(x), axis =0,)

目前我认为这是采用 df 的列,将它们传递给 snr_pd() 并将它们附加到列 ['s/n'] 下的 sd,但产生的唯一答案是 NaN。

我还尝试了一些结构更改,例如使用 applymap() 而不是 apply()。

sd['s/n'] = fd.applymap(lambda x: snr_pd(x), na_action = 'ignore')

但是这会返回此错误:

ValueError: 零大小数组到没有标识的归约操作最大值

我更不了解。

任何帮助都会非常有用。

【问题讨论】:

  • 首先,如果您已经定义了函数,只需将其作为对.apply() 的引用传递。使用 lambda 仅适用于需要定义函数的情况。其次,您的 DataFrame 是否有任何 nan 值或非数字值?三、Zhangfit_output在哪里定义?第四,您的函数似乎需要一个数组作为输入,但使用 apply 将函数一一映射到每一列的值,类似于 map(func, some_list)
  • 数据框上没有 nan 值,所有值都是数字。 Zhangfit_output 来自 BaselineRemoval 包,定义为:spec_obj = BaselineRemoval(fd[h]) Zhangfit_output = spec_obj.ZhangFit()。你能给我解释一下第四部分吗?

标签: python pandas dataframe lambda apply


【解决方案1】:

看起来您的函数 snr_pd() 需要一个完整的数组作为参数。

没有看到你的数据很难说,但你应该能够使用np.apply_along_axis()直接将函数应用到DataFrame:

np.apply_along_axis(snr_pd, axis=0, arr=df)

请注意,这假定df 中的每一列都是数字。如果没有,那么只需选择您要应用该函数的 df 的列。

还要注意np.apply_along_axis() 将返回一个 numpy 数组。

【讨论】:

  • 是的,每一列都代表一个数组。您是指列的名称还是列中只有数字?在这种情况下,他们是,所以这应该工作!应该试一试并报告。感谢您的帮助
  • 更改产生与上面发布的第二个实例相同的错误
  • 你需要提供示例数据,我无法帮你调试我看不到的东西。
  • 这会产生第二个错误。尽管与df 混淆了大小,但似乎原始df 太大而无法一次处理,因此是第二个错误。该方法应该可以分解df
  • df 是 2647 行 x 2011 列,所有数据都是数字。 columns = ID,Wavenumber,Particle n,Particle n+1 .....等等我不知道我是否发布了文字数据
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-04
  • 1970-01-01
  • 1970-01-01
  • 2019-11-23
  • 1970-01-01
相关资源
最近更新 更多