Rpy2:如何将字典列表转换为R数据框

我有以下字典的Python列表(来自sqlite3行工厂):


obs = [{'ave': 0.027, 'pap': 0.277}, 

{'ave': 0.29, 'pap': 0.333}, 

{'ave': 0.25, 'pap': 0.5}]

我想将其转换为R data.frame,以便与rpy2(版本2.3.6)一起使用,因此它看起来像这样


    ave   pap  


1 0.027 0.277 

2 0.29  0.333

3 0.25  0.5

我能够将单个“行”转换为data.frame,如下所示:


robjects.DataFrame(obs[0])


    ave   pap 


1 0.027 0.277 

使用robjects.DataFrame(obs)不起作用... ValueError:obj可以是可迭代类的实例(例如Python dict,rpy2.rlike.container OrdDict或VECSXP类型的rpy2.rinterface.SexpVector的实例。


我也尝试使用将其转换为OrdDict,rpy2.rlike.container.OrdDict(obs)但出现ValueError:太多值无法解压


我认为有许多不同的技术可以实现这一目标,而rpy2和Python中的大量数据结构使我感到困惑。


波斯汪
浏览 338回答 2
2回答

暮色呼如

当obs变大时,创建R数据帧并将其附加会导致性能问题。解决此问题的一种方法是在Python中“转置”结果。# "transpose" the data structure in Pythonfrom collections import defaultdictd = defaultdict(list)for row in obs:    for colname in row:        d[colname].append(row[colname])# Assuming that all data are floats# (if not the case a mapping between SQLite3 types and R vector types is needed)for rpy2.robjects.vectors import FloatVectorfor colname in d:    d[colname] = FloatVector(d[colname])# data framefrom rpy2.robjects import DataFramedataf = DataFrame(d)

BIG阳

我实际上找到了一个答案(这可能不是最有效的,但对我来说是有用的):在Python中:df = robjects.DataFrame(obs[0])for ob in obs[1:]:    df = df.rbind(robjects.DataFrame(ob))如果有人有更好,更优雅,更有效的解决方案,欢迎他/她发布。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python