numpy调用已弃用DataFrame.swapaxes触发警告,如何解决?
解决numpy.split处理Pandas DataFrame时触发的FutureWarning警告
问题场景
在Jupyter Notebook中执行数据拆分代码时,触发了FutureWarning:
train, val, test = np.split(df.sample(frac=1), [int(0.8*len(df)), int(0.9*len(df))])
警告详情:
Anaconda3\lib\site-packages\numpy\core\fromnumeric.py:59: FutureWarning: 'DataFrame.swapaxes' is deprecated and will be removed in a future version. Please use 'DataFrame.transpose' instead.
return bound(*args, **kwds)
附使用的DataFrame结构:
触发原因
这是numpy与pandas的版本兼容问题:numpy的split函数内部调用了pandas已弃用的DataFrame.swapaxes方法,而pandas已明确标记该方法过时,推荐使用DataFrame.transpose替代。目前这是numpy官方已知的未修复问题。
消除警告的解决方法
方案1:改用Pandas原生切片拆分(推荐)
直接使用pandas的iloc索引切片操作拆分打乱后的DataFrame,完全避开numpy的split函数,从根源避免兼容问题:
# 先打乱数据 shuffled_df = df.sample(frac=1) # 按比例拆分 train = shuffled_df.iloc[:int(0.8 * len(df))] val = shuffled_df.iloc[int(0.8 * len(df)) : int(0.9 * len(df))] test = shuffled_df.iloc[int(0.9 * len(df)):]
方案2:临时屏蔽指定警告
如果不想修改现有代码逻辑,可以针对性屏蔽这个FutureWarning,仅隐藏该提示不影响功能:
import warnings # 上下文管理器中屏蔽指定警告 with warnings.catch_warnings(): warnings.filterwarnings( "ignore", category=FutureWarning, message="'DataFrame.swapaxes' is deprecated" ) train, val, test = np.split(df.sample(frac=1), [int(0.8*len(df)), int(0.9*len(df))])
注意:此方法只是隐藏警告,未解决底层兼容问题,适合临时过渡使用。
方案3:升级numpy至修复版本
等待numpy官方发布修复该兼容问题的版本后,升级numpy到对应版本即可彻底解决。
内容的提问来源于stack exchange,提问作者Aritra Mandal
相关产品推荐
相关产品推荐

