【问题标题】:Convert Pandas df to rda file将 Pandas df 转换为 rda 文件
【发布时间】:2020-06-12 15:15:53
【问题描述】:

我正在用 Python 清理我的数据,但我们用于可视化的程序是为 R 设置的。我正在尝试将我的数据帧保存为 rda 文件。我可以在这里找到资源开始使用,但是我的 df 有 92 列,当它转换为 rda 时,它有 1942 列,类似于以下内容。

import rpy2
from rpy2 import robjects
from rpy2.robjects import pandas2ri
pandas2ri.activate()

df = pd.DataFrame({'A': [1, 2, 3], 'B':[10, 9, 8], 'C':['A', 'B', 'C']})


    A   B   C
0   1   10  A
1   2   9   B
2   3   8   C

编辑:我已经尝试了这两种转换并得到了相同的结果。

df = pandas2ri.py2ri(df)

def save_rdata_file(df, filename):
    r_data = pandas2ri.py2ri(df)
    robjects.r.assign('my_df', r_data)
    robjects.r("save(my_df, file=paste0('{}'))".format(filename))

save_rdata_file(df, file_location)



result = pd.DataFrame({'A': [1, 2, 3], 'B':[10, 9, 8], 'C':['A', 'B', 'C'],
                   'A.1': [1, 1, 1], 'A.2': [2, 2, 2], 'A.3':[3, 3, 3],
                   'B.1':[10, 10, 10], 'B.2':[9, 9, 9], 'B.3':[8, 8, 8],
                   'C.1':['A', 'A', 'A'], 'C.2':['B', 'B', 'B'], 'C.3':['C', 'C', 'C']})

    A   B   C   A.1 A.2 A.3 B.1 B.2 B.3 C.1 C.2 C.3
0   1   10  A   1   2   3   10  9   8   A   B   C
1   2   9   B   1   2   3   10  9   8   A   B   C
2   3   8   C   1   2   3   10  9   8   A   B   C

【问题讨论】:

  • 我建议将它们保存为羽毛文件。然后从 R 中,直接打开羽毛文件。
  • 我无法重现您不想要的结果。请发帖:print(rpy2.__version__)。由于rpy2 是一个积极开发的项目,请务必使用最新版本。
  • 顺便说一下,.rdata 通常用于允许多个对象保存到磁盘的环境,因此对于一个数据帧来说是多余的。考虑 .rds,它只是 一个 保存到磁盘的特定对象。
  • @Parfait 我一共有 6 个 dfs 我试图保存在一个 rda 文件中。我正在使用 rpy2 的 2.9.4 版本。
  • 究竟什么是result?你是如何生成它的?请出示那条线。仅供参考 - 确保所有发布的代码都是可运行的。

标签: python r pandas rpy2 rda


【解决方案1】:

我认为你使用的是@anthonybell's solution

import rpy2
from rpy2 import robjects
from rpy2.robjects import pandas2ri
import pandas as pd
pandas2ri.activate()

df = pd.DataFrame({'A': [1, 2, 3], 'B':[10, 9, 8], 'C':['A', 'B', 'C']})
r_data = pandas2ri.py2ri(df)
robjects.r.assign("df", r_data)
robjects.r("save(df, file='test.rda')")

In R:
load("test.rda")
> ls()
[1] "df"
> str(df)
'data.frame':   3 obs. of  3 variables:
 $ A: int  1 2 3
 $ B: int  10 9 8
 $ C: chr  "A" "B" "C"

它对我来说很好用。我在 R 3.6.1、python 3.6.10、pandas 1.0.1、rpy 2.9.4 上。所以下面是另一种解决方案,使用pickle,但它需要在R中使用reticulate:

import pandas as pd
df = pd.DataFrame({'A': [1, 2, 3], 'B':[10, 9, 8], 'C':['A', 'B', 'C']})
df.to_pickle("./test.pkl")

In R:
library(reticulate)
pd = import("pandas",convert=TRUE)
str(df)
'data.frame':   3 obs. of  3 variables:
 $ A: num  1 2 3
 $ B: num  10 9 8
 $ C: chr  "A" "B" "C"
 - attr(*, "pandas.index")=RangeIndex(start=0, stop=3, step=1)

【讨论】:

    猜你喜欢
    • 2018-05-29
    • 2020-06-09
    • 2018-11-30
    • 2017-05-17
    • 1970-01-01
    • 1970-01-01
    • 2021-11-03
    • 2021-11-30
    • 2022-01-19
    相关资源
    最近更新 更多