如何消除R中reticulate调用pandas读取pickle时的FutureWarning
解决R中reticulate读取pickle时的pandas FutureWarning问题
这些警告来自Python的pandas库,R的suppressWarnings/suppressMessages管不到Python环境的输出,试试下面几个方法:
方法1:在Python层面精准过滤警告
直接调用Python的warnings模块,只忽略pandas的FutureWarning,不影响其他警告:
library(reticulate) # 导入Python的warnings模块 warnings <- import("warnings") # 过滤pandas的FutureWarning warnings$filterwarnings("ignore", category = import("pandas")$FutureWarning) # 导入pandas并读取数据 pd <- import("pandas") hubs.data <- pd$read_pickle("input.pickle")
方法2:转换索引类型(从根源解决)
警告是因为pickle里的数据用了pandas已废弃的专用索引类型,读取后把它们换成官方推荐的Index+指定dtype,后续操作就不会再触发警告:
library(reticulate) pd <- import("pandas") hubs.data <- pd$read_pickle("input.pickle") # 处理DataFrame的索引 if (inherits(hubs.data$index, "pandas.Float64Index")) { hubs.data$index <- pd$Index(hubs.data$index, dtype = "float64") } else if (inherits(hubs.data$index, "pandas.Int64Index")) { hubs.data$index <- pd$Index(hubs.data$index, dtype = "int64") } else if (inherits(hubs.data$index, "pandas.UInt64Index")) { hubs.data$index <- pd$Index(hubs.data$index, dtype = "uint64") } # 如果读取的是Series,同样处理索引 if (inherits(hubs.data, "pandas.Series")) { index_type <- class(hubs.data$index)[1] if (index_type == "pandas.Float64Index") { hubs.data$index <- pd$Index(hubs.data$index, dtype = "float64") } else if (index_type == "pandas.Int64Index") { hubs.data$index <- pd$Index(hubs.data$index, dtype = "int64") } else if (index_type == "pandas.UInt64Index") { hubs.data$index <- pd$Index(hubs.data$index, dtype = "uint64") } }
方法3:全局关闭Python警告(谨慎使用)
如果不想区分警告类型,直接忽略Python环境的所有警告,但可能会错过其他有用提示,按需使用:
library(reticulate) # 运行Python代码关闭所有警告 py_run_string("import warnings; warnings.filterwarnings('ignore')") pd <- import("pandas") hubs.data <- pd$read_pickle("input.pickle")
内容的提问来源于stack exchange,提问作者zhang
相关产品推荐
相关产品推荐

