【发布时间】: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