首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Rpy2 pandas2ri.ri2py()正在将NA值转换为整数

Rpy2 pandas2ri.ri2py()正在将NA值转换为整数
EN

Stack Overflow用户
提问于 2016-11-17 22:47:54
回答 1查看 955关注 0票数 1

我使用Rpy2版本2.8.4与R3.3.0和python2.7.10一起创建一个R数据

代码语言:javascript
复制
import rpy2.robjects as ro
from rpy2.robjects import r
from rpy2.robjects import pandas2ri

df = ro.DataFrame({'Col1': ro.vectors.IntVector([1, 2, 3, 4, 5]),
               'Col2': ro.vectors.StrVector(['a', 'b', 'c', 'd', 'e']),
               'Col3': ro.vectors.FactorVector([1, 2, 3, ro.NA_Integer, ro.NA_Integer])})
print df

   | Col2 | Col3 | Col1 |
   ----------------------
 1 |  a   | 1    | 1    |
 2 |  b   | 2    | 2    |
 3 |  c   | 3    | 3    |
 4 |  d   | NA   | 4    |
 5 |  e   | NA   | 5    |

我可以毫不费力地把它转换成熊猫的数据。

代码语言:javascript
复制
pandas2ri.ri2py(df)

   | Col2 | Col3 | Col1 |
   ----------------------
 1 |  a   | 1    | 1    |
 2 |  b   | 2    | 2    |
 3 |  c   | 3    | 3    |
 4 |  d   | NA   | 4    |
 5 |  e   | NA   | 5    |

但是,我注意到FactorVector元数据包括“NA”作为一个因素级别,

代码语言:javascript
复制
print r('levels(df$Col3)')

[1] "1"  "2"  "3"  "NA"

我理解在创建R因子时,这不是默认行为。

如果我把“NA”从因子水平上降下来,

代码语言:javascript
复制
r.assign('df', df)
r('df$Col3 <- factor(as.numeric(levels(df$Col3))[df$Col3])')

然后,当把R数据转换成熊猫数据时,我得到了一个完全不同的结果。

代码语言:javascript
复制
df2 = r['df']
pandas2ri.ri2py(df2)

   | Col2 | Col3 | Col1 |
   ----------------------
 1 |  a   | 1    | 1    |
 2 |  b   | 2    | 2    |
 3 |  c   | 3    | 3    |
 4 |  d   | 1    | 4    |
 5 |  e   | 1    | 5    |

我的问题是,这是一个bug,还是我做错了什么,假设NA_Integer值不应该作为因子级别包含在R数据仓库中?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-11-19 16:05:02

将R data.frame中的一列因子转换为熊猫DataFrame中的一列,正在发生用那个代码。没有以特定的方式处理NAs,所以这必须发生在转换的上游。如果您查看您的列"Col3",您会发现NAs已经被列为因子中的级别。

代码语言:javascript
复制
>>> print(df.rx2("Col3"))
[1] 1  2  3  NA NA
Levels: 1 2 3 NA

这甚至是R data.frame创建的上游:

代码语言:javascript
复制
>>> lst = [1, 2, 3, ro.NA_Integer, ro.NA_Integer]
>>> print(ro.vectors.FactorVector(lst))
[1] 1  2  3  NA NA
Levels: 1 2 3 NA

正在发生的情况是,FactorVector在rpy2中的构造函数对参数exclude使用的缺省值与R的factor()函数中的构造函数不同(我认为这样做是为了使整数之间的映射在默认情况下用作级别向量的索引)。

R的默认行为可以通过以下方式恢复:

代码语言:javascript
复制
>>> v = ro.vectors.FactorVector(lst, exclude=ro.StrVector(["NA"]))
>>> print(v)
[1] 1    2    3    <NA> <NA>
Levels: 1 2 3

这里的问题是,没有用于表示缺失值的指南(在IEEE标准的意义上)。R使用的是任意的极值,但是Python没有缺失值的概念。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40666458

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档