You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

含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。

步骤:

  1. 先安装依赖:pip install rpy2(确保你的系统已经安装了R环境)
  2. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.07 14:47:28