如何对pandas DataFrame中的数据执行expit变换
pandas对DataFrame执行expit变换的实现方案
expit函数也就是常说的sigmoid函数,你给出的计算公式exp(x)/(1+exp(x))和常用写法1/(1+exp(-x))数学上完全等价,计算结果一致,以下是两种可直接运行的实现方式:
方法1:手动按公式实现(无额外统计库依赖)
只需要pandas和numpy即可完成,适合不想额外装依赖的场景:
- 首先构造你的原始数据集
import pandas as pd import numpy as np df = pd.DataFrame({ 'Id': [1, 2], 'B': [0, 2], 'C': [-1, -2] })
- 对需要变换的数值列应用公式计算,注意
Id是标识列不需要参与变换,最后按示例保留3位小数即可匹配预期输出:
# 指定需要做expit变换的列 target_cols = ['B', 'C'] df[target_cols] = df[target_cols].apply(lambda x: np.exp(x) / (1 + np.exp(x))).round(3)
执行后打印df就能得到目标结果:
Id B C 0 1 0.500 0.269 1 2 0.881 0.119
方法2:调用scipy内置expit函数(数值稳定性更好)
如果你的数据集存在极大/极小的极端值,手动实现的公式可能出现数值溢出问题,scipy库内置了优化过的expit实现,计算稳定性更强:
import pandas as pd from scipy.special import expit df = pd.DataFrame({ 'Id': [1, 2], 'B': [0, 2], 'C': [-1, -2] }) target_cols = ['B', 'C'] df[target_cols] = df[target_cols].apply(expit).round(3)
运行结果和手动计算完全一致,和你给出的预期输出匹配。
提示:如果不需要和示例一样保留3位小数,去掉代码末尾的
.round(3)即可得到全精度的计算结果。
内容的提问来源于stack exchange,提问作者Nabih Bawazir
相关产品推荐
相关产品推荐

