含NA的R data.table导入Python遇内存分配错误求助
解决pyreadr导入带NA的R data.table RDS文件失败的问题
我之前也碰到过类似的情况,pyreadr对带缺失值的data.table格式RDS文件的兼容性确实存在问题。这里有几个可靠的解决办法:
方法1:跨语言格式转换(推荐)
用R将data.table保存为跨语言友好的格式,比如Feather或者Parquet,这两种格式能很好保留数据类型和缺失值,且读写速度快。
R端保存代码:
library(data.table) library(arrow) # 需要先安装:install.packages("arrow") df <- data.table(Name="Heilbronn", lon=9.208, lat=49.124, type=c(NA, "bus_station"), north=c(NA, 4.5)) write_feather(df, "test_dt.feather") # 保存为Feather格式 # 或者用Parquet格式:write_parquet(df, "test_dt.parquet")
Python端读取代码:
import pandas as pd # 读取Feather文件 df = pd.read_feather("test_dt.feather") # 读取Parquet文件的话:df = pd.read_parquet("test_dt.parquet")
方法2:用rpy2直接调用R读取
如果不想修改R的保存逻辑,可以用rpy2包直接在Python中调用R的读取函数,再转换为Pandas DataFrame。
步骤:
- 先安装依赖:
pip install rpy2(确保你的系统已经安装了R环境) - Python代码:
import rpy2.robjects as ro from rpy2.robjects import pandas2ri from rpy2.robjects.packages import importr # 启用R与Pandas的双向转换 pandas2ri.activate() # 导入R的data.table包(确保R中已安装) data_table = importr('data.table') # 读取RDS文件 r_data = ro.r['readRDS']("test_dt.r") # 转换为Pandas DataFrame pd_data = pandas2ri.rpy2py(r_data)
方法3:R端转存为CSV
如果对数据类型要求不高,也可以用data.table的fwrite快速保存为CSV,再用Pandas读取:
R端保存:
library(data.table) df <- data.table(Name="Heilbronn", lon=9.208, lat=49.124, type=c(NA, "bus_station"), north=c(NA, 4.5)) fwrite(df, "test_dt.csv") # fwrite比base::write.csv速度快很多
Python端读取:
import pandas as pd df = pd.read_csv("test_dt.csv", na_values=["NA"])
问题原因说明
pyreadr底层依赖的librdata库对data.table的特殊结构(尤其是包含混合类型+缺失值的列)解析支持不完善,导致出现内存分配错误。而na.omit后的data.table因为没有缺失值,或者普通data.frame的结构更简单,所以能正常解析。
内容的提问来源于stack exchange,提问作者Max M
相关产品推荐
相关产品推荐

