为Pandas两列应用函数并赋值回原DataFrame时遇FutureWarning的解决方法
解决方法
1. 修复自定义函数的索引方式(消除警告)
警告的根源是:当apply(axis=1)处理每行时,传入函数的mean_std是一个Series对象,直接用[0]/[1]按位置取值的方式在未来版本会被废弃,改为将整数视为标签名而非位置。因此需要用iloc明确指定按位置访问:
def log_normal_transform(mean_std): # 用iloc按位置获取第0、1个元素 mu = mean_std.iloc[0] sigma = mean_std.iloc[1] return mu*2, sigma*2
2. 正确赋值回原DataFrame(避免长度不匹配)
不需要用.values.tolist(),可以通过apply的result_type='expand'参数直接将返回的元组序列展开为DataFrame,再直接赋值回原列:
df = pd.DataFrame({'mean': [3, 11, 9, 19, 22], 'std': [10, 17, 10, 25, 30]}) # 执行转换并直接展开为DataFrame赋值 df[['mean', 'std']] = df[['mean', 'std']].apply(log_normal_transform, axis=1, result_type='expand')
额外推荐:矢量化操作(更高效)
如果你的真实对数正态转换逻辑可以用矢量化实现(而非逐行apply),建议优先使用这种方式,效率远高于apply:
以真实的对数正态分布参数转换公式为例:
import numpy as np # 计算mu和sigma(真实对数正态转换逻辑) df['mu'] = np.log(df['mean'] ** 2 / np.sqrt(df['std'] ** 2 + df['mean'] ** 2)) df['sigma'] = np.sqrt(np.log(1 + (df['std'] ** 2) / (df['mean'] ** 2)))
内容的提问来源于stack exchange,提问作者Emi OB
相关产品推荐
相关产品推荐

