原因:
我正在使用 globals()
在 Python 中以编程方式创建数据帧.
在下面的代码中,我创建了 5 个数据集,它们以大写的“PREFIX”开头,后跟一个字母,然后以一个后缀结尾。
R
library(reticulate)
repl_python()
python
import os
import pandas as pd
letters = ('a','b','c','d','e')
df_names = []
for ele in letters:
globals()['PREFIX_{}_suffix'.format(ele)] = pd.DataFrame(columns = ['col_a', 'col_b']).astype(str)
df_names.append(['PREFIX_{}_suffix'.format(ele)][0])
print(df_names)
['PREFIX_a_suffix', 'PREFIX_b_suffix', 'PREFIX_c_suffix', 'PREFIX_d_suffix', 'PREFIX_e_suffix']
请求:
我想选择以前缀开头的数据帧(最好使用正则表达式 ^PREFIX
)并以编程方式将这些特定数据帧从网状 python 环境移动到 R 环境。
为了这项任务,我将数据帧变量名称添加到 df_names
中.但是,强烈建议使用正则表达式。
我知道变量存储在 py
中可以使用 $
访问的对象..但我不确定如何迭代地选择数据帧并将这些数据帧以编程方式一次从 python 环境移动到 R 环境。
在 R 中,我通常使用 ls(pattern=<regex>)
在 R 环境中选择对象。
在 Python 中,您可以使用 locals()
列出变量,看这个thread .
这thread讨论将 python 函数从 R 传递给 python。
最佳答案
这是我使用正则表达式的解决方案:
在 python 中:
- 创建您的正则表达式模式以获取所需的已定义变量
- 将您的模式应用到
dir()
输出,它捕获 python 环境中定义的变量 - 将选定/获取的变量 (dfs) 保存在列表中
import os
import re
r = re.compile("^PREFIX")
py_dfs = list(filter(r.match, dir())) # fetch defined variables from python's env
print(py_dfs)
['PREFIX_a_suffix', 'PREFIX_b_suffix', 'PREFIX_c_suffix', 'PREFIX_d_suffix', 'PREFIX_e_suffix']
在 R 中:
- 从具有选定变量名称的 python 访问该列表
- 使用 R 的
reticulate::py_eval
评估您的 python 对象,使用reticulate::py_to_r
将其转换为 r - 使用
assign
为动态定义的变量分配与 python 中的变量(数据帧)相同的name
for (df in py$py_dfs){
name = df
r_df = py_to_r(py_eval(df))
assign(paste0(name), r_df)
}
> ls(pattern="^PREFIX")
[1] "PREFIX_a_suffix" "PREFIX_b_suffix" "PREFIX_c_suffix" "PREFIX_d_suffix" "PREFIX_e_suffix"
> dim(PREFIX_a_suffix)
[1] 0 2
> class(PREFIX_a_suffix)
[1] "data.frame"
>
关于python - R Reticulate - 以编程方式将定义的变量从 Python 环境移动到 R,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73149140/