Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/348.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 转换为数据帧时保留R数据帧索引值_Python_R_Rpy2_Lme4 - Fatal编程技术网

Python 转换为数据帧时保留R数据帧索引值

Python 转换为数据帧时保留R数据帧索引值,python,r,rpy2,lme4,Python,R,Rpy2,Lme4,使用R(基本版本3.5.2)包LME4安装混合效果模型,通过Python3.6中的rpy2 2.9.4运行 能够将随机效果打印为索引数据帧,其中索引值是用于定义组的分类变量的值(使用): 将其转换为数据帧时,索引中的分类值将丢失,并替换为整数: pandas2ri.ri2py_dataframe(r_ranef[1]) # r_ranef is a dict of dataframes Uppm (Intercept) floor (Intercept) 0 -

使用R(基本版本3.5.2)包LME4安装混合效果模型,通过Python3.6中的rpy2 2.9.4运行

能够将随机效果打印为索引数据帧,其中索引值是用于定义组的分类变量的值(使用):

将其转换为数据帧时,索引中的分类值将丢失,并替换为整数:

pandas2ri.ri2py_dataframe(r_ranef[1])  # r_ranef is a dict of dataframes

    Uppm  (Intercept)         floor  (Intercept)
0  -0.002678    -0.002589  1.742426e-09    -0.005200
1  -0.005669    -0.006419 -4.482764e-09    -0.012894
2   0.002191     0.001191  1.211201e-09     0.002392
3   0.009325     0.008190  5.135196e-09     0.016453
4   0.001875     0.001049  1.746748e-09     0.002108
5  -0.007376    -0.002430  0.000000e+00    -0.004882
6   0.011294     0.004177  5.507525e-09     0.008391
7   0.006922     0.002545  4.911563e-11     0.005112
如何保留原始索引的值

建议的
as.data.frame
可能包含
grp
,这可能是我想要的值,但我正在努力通过rpy2实现它;e、 g

r_ranef = ro.r['ranef.as.data.frame']

不起作用

请考虑在R数据框中添加
行。名称
作为新列,然后使用此列在R数据框中设置索引:

base = importr('base')

# ADD NEW COLUMN TO R DATA FRAME
re[1] = base.transform(re[1], index = base.row_names(re[1]))

# SET INDEX IN PANDAS DATA FRAME
py_df = (pandas2ri.ri2py_dataframe(re[1])
                     .set_index('index')
                     .rename_axis(None)
        )
要跨列表中的所有数据帧执行此操作,请使用R的
lappy
循环,然后使用Python的列表理解来创建索引数据帧的新列表

base = importr('base')

mod = lme4.lmer(**kwargs)          # Omitting arguments for brevity
r_ranef = lme4.ranef(mod)

# R LAPPLY
new_r_ranef = base.lapply(r_ranef, lambda df: 
                          base.transform(df, index=base.row_names(df)))

# PYTHON LIST COMPREHENSION
py_df_list = [(pandas2ri.ri2py_dataframe(df)
                         .set_index('index')
                         .rename_axis(None)
              ) for df in new_r_ranef]
这可能是rpy2中的一个小错误/缺失功能,但解决方法相当简单:

with localconverter(default_converter + pandas2ri.converter) as conv:
    pd_dataf = conv.rpy2py(r_dataf)
pd_dataf.index = r_dataf.rownames

pandas2ri.ri2py\u数据帧
的一个孤立问题,它正在丢弃R数据帧的索引您的
rpy2
版本是什么:
打印(rpy2.\uuu版本)
pip显示rpy2
?截至,R数据框row.names使用
pandas2ri.ri2py_数据框
作为索引在pandas数据框中传播。编辑:添加了rpy2版本2.9.4。在注释中列出了,为什么原始转换无法使用
pandas2ri.ri2py_数据框
迁移row.names?可能是回归。。。而且没有单元测试来捕捉它。现在在进行后续操作。现在通过一个配套的单元测试(可能再次)修复了这个问题:是的。rpy2-3.0.0尚未发布。不过,安装dev版本是非常超前的。例如,这是一个bug,现在应该被修复。请重试(为rpy2开发人员安装最新快照后)。
import rpy2.robjects as ro
from rpy2.robjects import pandas2ri, default_converter
from rpy2.robjects.conversion import localconverter

r_dataf = ro.r("""
data.frame(
  Uppm = rnorm(5),
  row.names = letters[1:5]
)
""")

with localconverter(default_converter + pandas2ri.converter) as conv:
    pd_dataf = conv.rpy2py(r_dataf)

# row names are "a".."f"
print(r_dataf)

# row names / indexes are now 0..4
print(pd_dataf)
with localconverter(default_converter + pandas2ri.converter) as conv:
    pd_dataf = conv.rpy2py(r_dataf)
pd_dataf.index = r_dataf.rownames