【问题标题】:How to convert Python Pandas Dataframe to R data.frame如何将 Python Pandas Dataframe 转换为 R data.frame
【发布时间】:2018-01-23 00:05:40
【问题描述】:

我正在使用 R 包 PythonInR,并想使用函数 pyGet() 将 pandas 数据帧转换为 R 数据帧,但出现以下错误:

as.data.frame.default(xi, optional = TRUE, stringsAsFactors = stringsAsFactors) 中的错误:无法将“PythonObject”类强制转换为 data.frame

text.csv 文件只包含两列,name(string) 和 value(int)。 代码如下:

library(PythonInR) 
pyConnect() 
pyIsConnected() 
pyVersion()
pyOptions("usePandas", TRUE) 
pyImport("pandas", as="pd") 
test_code <-'py_df = pd.read_csv("test.csv")' 
pyExec(code = test_code) 
r_df <- pyGet("py_df")

而代码的输出是:

library(PythonInR)
pyConnect()
R is already connected to Python!
pyIsConnected()
[1] TRUE
pyVersion()
[1] "3.6.2 (v3.6.2:5fd33b5, Jul  8 2017, 04:57:36) [MSC v.1900 64 bit (AMD64)]"
pyOptions("usePandas", TRUE)
pyImport("pandas", as="pd")
test_code <- 'py_df = pd.read_csv("test.csv")'
pyExec(code = test_code)
r_df <- pyGet("py_df")

as.data.frame.default(x[[i]], optional = TRUE, stringsAsFactors = stringsAsFactors) 中的错误: 无法将“PythonObject”类强制转换为 data.frame

谁能帮助建议如何使用PythonInR 将 Pandas 数据帧转换为 R data.frame?

【问题讨论】:

  • 为什么不直接使用 R 的read.table 而不是追求这样的迂回方法呢?或者只是留在 Python 中。这里似乎没有任何协同作用的情况。
  • 感谢您的评论,但我只需要将其中一个项目中的 R 和 Python 代码组合为一个完整的数据处理流程,这将需要 Python 和 R 对象之间的转换
  • 你听说过feather project吗?
  • 感谢 Roman 的建议,是的,羽毛可用于 Python 和 R,但是如何将 R 中创建的羽毛对象传输到我的 Python 代码中,而不是将其写入本地文件然后读入 Python?

标签: python r dataframe


【解决方案1】:

你可以使用 json。 pandas 数据框有一个to_json 方法,您可以使用rjson R 包通过fromJSON 读取json 字符串。

您可能还会发现thisthis 很有趣。计划尽快提交给 CRAN,但我需要做更多测试。

【讨论】:

  • 您好,感谢您的建议!根据我的理解,还是需要将json文件写入本地,然后再读入R。但是我想知道有没有一种不需要读写的R和Python对象之间的转换方法?因为我已经可以从 R 调用 Python 代码了。
  • @yichi-liu,这取决于您的工作流程,但您可以将pyExec json 模块导入并将to_JSON 输出写入Python 字符串变量,然后使用pyGet 将其传输到R .
【解决方案2】:

很难说为什么它不起作用。

您是否有可重现的示例,或者您可以提供“test.csv”。 如果你认为这是一个错误,你可以给包作者写一封邮件。

据我所知,

sessionInfo()

## R version 3.4.0 (2017-04-21)
## Platform: x86_64-pc-linux-gnu (64-bit)
## Running under: Debian GNU/Linux 8 (jessie)
## 
## Matrix products: default
## BLAS: /home/florian/bin/R_dev/lib/libRblas.so
## LAPACK: /home/florian/bin/R_dev/lib/libRlapack.so
## 
## locale:
##  [1] LC_CTYPE=de_AT.UTF-8       LC_NUMERIC=C              
##  [3] LC_TIME=de_AT.UTF-8        LC_COLLATE=de_AT.UTF-8    
##  [5] LC_MONETARY=de_AT.UTF-8    LC_MESSAGES=de_AT.UTF-8   
##  [7] LC_PAPER=de_AT.UTF-8       LC_NAME=C                 
##  [9] LC_ADDRESS=C               LC_TELEPHONE=C            
## [11] LC_MEASUREMENT=de_AT.UTF-8 LC_IDENTIFICATION=C       
## 
## attached base packages:
## [1] stats     graphics  grDevices utils     datasets  methods   base     
## 
## other attached packages:
## [1] knitr_1.16      PythonInR_0.1-3
## 
## loaded via a namespace (and not attached):
## [1] compiler_3.4.0 magrittr_1.5   R6_2.2.1       markdown_0.8  
## [5] tools_3.4.0    stringi_1.1.5  pack_0.1-1     stringr_1.2.0 
## [9] evaluate_0.10

_

library(PythonInR)
pyConnect() 
## R is already connected to Python!

_

pyIsConnected() 
## [1] TRUE

_

pyVersion()
## [1] "2.7.9 (default, Mar  1 2015, 13:01:26) \n[GCC 4.9.2]"

_

pyOptions("usePandas", TRUE) 
pyImport("pandas", as="pd") 

_

pySet("x", head(cars))   
pyExecp("x")
##    dist  speed
## 0     2      4
## 1    10      4
## 2     4      7
## 3    22      7
## 4    16      8
## 5    10      9

_

pyExecp("type(x)")
## <class 'pandas.core.frame.DataFrame'>
str(pyGet("x"))
## 'data.frame':    6 obs. of  2 variables:
##  $ speed: num  4 4 7 7 8 9
##  $ dist : num  2 10 4 22 16 10

【讨论】:

  • 看起来 OP 在 PythonInR Cannot convert Python Pandas Dataframe to R 上打开了一个错误报告。根据他的示例,我猜想在转换包含字符串的name 列时遇到问题。字符串不是原生的pandas 数据类型,因此它回退到使用“Python 对象”来存储它们。我几乎不知道pandas,也没有R,但您可以通过使用包含一列字符串值的csv 重新运行代码来测试这一点。
猜你喜欢
  • 2022-01-23
  • 1970-01-01
  • 1970-01-01
  • 2021-06-14
  • 2021-11-06
  • 2017-09-20
  • 2013-05-25
  • 2022-09-29
  • 2017-03-17
相关资源
最近更新 更多