'RPY2 error in Python script! (Conversion 'py2rpy' not defined for objects of type '<class 'pandas.core.frame.DataFrame'>')

This is my current Python code:

import pandas as pd
import numpy as np
import rpy2.robjects.packages as rp
from rpy2 import robjects as ro

utils = rp.importr('utils')
utils.chooseCRANmirror(ind=1)
utils.install_packages("sidrar")
sidrar = rp.importr("sidrar")
    
table_NameUrl = pd.read_csv("Data.txt", sep=";", header= None)
table_Size = len(table_NameUrl)
sequence = np.arange(1, table_Size, 2)
for i in sequence:
 csvName = table_NameUrl.iloc[::2]
 csvUrl = table_NameUrl.iloc[1::2]
 last_url = "/n3/all/n6/in%20n3%2028"
 fileName = (tableName + ".csv")
 url = (csvUrl + last_url)
 ro.globalenv['fileName'] = fileName
 ro.globalenv['url'] = url
 ro.r('table= get_sidra(api= url)')
 ro.r('write.csv(table, file= fileName, row.names = F)

Short version of CSV (line by line):

Panu 2.1.1, 2.1.5

/t/2093/p/2000,2010/v/93/c86/2776,2777,2778,2779,2780,2781/c2/0,4,5/c1/1,2/

Panu 5.1.1, 5.1.2, 5.1.3, 5.1.4, 5.1.5, 5.1.6, 5.1.7, 5.1.9, 5.1.10

/t/1612/p/2013,2014,2015,2016,2017/v/109,216,214/c81/2688,2691,2692,2694,2696,2708,2702,2715,2703/

Panu 5.1.8

/t/839/p/2013,2014,2015,2016,2017/v/109,216,214/c81/114254/

I´m using rpy2 in Python to get R's sidrar package.

I'm not using native Python packages sidrapy or DadosAbertosBrasil because I need to auto generate a lot of CSVs with the Sidra API's URLs from Data.txt. So, sidrar is the best one to do it.

But when I try to use new CSV's name inside of fileName and new CSV's url inside of url this error appears:

Conversion 'py2rpy' not defined for objects of type '<class 'pandas.core.frame.DataFrame'>'

P.S.: last_url is a url complement to get full Sidra API table, so that's why I need to concatenate the strings.


Solution: I added this function below in my Python code and the error is gone.

from rpy2.robjects.conversion import localconverter as lc

with lc(ro.default_converter + pr.converter):
  fileName_c = ro.conversion.py2rpy(fileName)
  url_c = ro.conversion.py2rpy(url)
ro.globalenv['fileName'] = fileName_c
ro.globalenv['url'] = url_c


Solution 1:[1]

This fixed the error. It seems to call an R function on pandas dataframe we have to first import the pandas2ri object from rpy2.

from rpy2.robjects import pandas2ri


pandas2ri.activate()

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 Martin Gal