Pandas - how to convert r dataframe back to pandas?

前端 未结 4 2148
广开言路
广开言路 2020-12-24 01:43

I converted a pandas df to r using the the below:

import pandas as pd
import pandas.rpy.common as com
import rpy2.robjects as ro
from rpy2.robjects.packages          


        
相关标签:
4条回答
  • 2020-12-24 02:08

    Since rpy2 release 2.4.0 converting data frames back and forth between rpy2 and pandas is included as an optional module. With it, no need to convert explicitly, it will be done on the fly.

    The documentation contains examples (also available as a Jupyter notebook - link available near the top of the page): https://rpy2.github.io/doc/latest/html/pandas.html#interoperability-with-pandas

    Note: The original answer to this question recommended the following.

    from rpy2.robjects import pandas2ri
    pandas2ri.activate()
    

    If wishing to convert explicitly for any reason, the functions are pandas2ri.py2ri() and pandas2ri.ri2py() (they were pandas2ri.pandas2ri() and pandas2ri.ri2pandas()).

    Note: Since rpy2 release 3.3.0 explicit conversion is done as follows

    import rpy2.robjects as ro
    
    dt = pd.DataFrame()
    # To R DataFrame
    r_dt = ro.conversion.py2rpy(dt)
    # To pandas DataFrame
    pd_dt = ro.conversion.rpy2py(r_dt)
    

    For more details check out this link.

    0 讨论(0)
  • 2020-12-24 02:17

    Use pandas to read an rpy2 dataframe, r_df. It will avoid the deprecation warning "FutureWarning: from_items is deprecated. Use DataFrame.from_dict(dict(items), ...) instead"

    type(r_df) is "rpy2.robjects.vectors.DataFrame".
    type(pd_df) is "pandas.core.frame.DataFrame"

    pd_df = pd.DataFrame.from_dict({ key : np.asarray(r_df.rx2(key)) for key in r_df.names })

    0 讨论(0)
  • 2020-12-24 02:18

    Given your import, it appears it is:

    com.convert_robj(rdf)
    

    For example,

    In [480]: dfrm
    Out[480]:
               A          B  C
    0   0.454459  49.916767  1
    1   0.943284  50.878174  1
    2   0.974856  50.335679  2
    3   0.776600  50.782104  1
    4   0.553895  50.084505  1
    5   0.514018  50.719019  2
    6   0.915413  50.513962  0
    7   0.771571  49.859855  2
    8   0.068619  49.409657  0
    9   0.728141  50.945174  2
    10  0.388115  47.879653  1
    11  0.960172  49.680258  0
    12  0.015216  50.067968  0
    13  0.495024  50.286287  1
    14  0.565954  49.909771  1
    15  0.992279  49.009696  1
    16  0.179934  49.554256  0
    17  0.521243  47.854791  0
    18  0.551241  51.076262  1
    19  0.713271  49.418503  0
    20  0.801716  50.660304  1
    
    In [481]: rdfrm = com.convert_to_r_dataframe(dfrm)
    
    In [482]: rdfrm
    Out[482]:
    <DataFrame - Python:0x14905cf8 / R:0x1600ee98>
    [FloatVector, FloatVector, IntVector]
      A: <class 'rpy2.robjects.vectors.FloatVector'>
      <FloatVector - Python:0xf9d0b00 / R:0x140e2620>
    [0.454459, 0.943284, 0.974856, ..., 0.551241, 0.713271, 0.801716]
      B: <class 'rpy2.robjects.vectors.FloatVector'>
      <FloatVector - Python:0xf9d0878 / R:0x125aa240>
    [49.916767, 50.878174, 50.335679, ..., 51.076262, 49.418503, 50.660304]
      C: <class 'rpy2.robjects.vectors.IntVector'>
      <IntVector - Python:0x11fceef0 / R:0x13f0d918>
    [       1,        1,        2, ...,        1,        0,        1]
    
    In [483]: com.convert_robj(rdfrm)
    Out[483]:
               A          B  C
    0   0.454459  49.916767  1
    1   0.943284  50.878174  1
    2   0.974856  50.335679  2
    3   0.776600  50.782104  1
    4   0.553895  50.084505  1
    5   0.514018  50.719019  2
    6   0.915413  50.513962  0
    7   0.771571  49.859855  2
    8   0.068619  49.409657  0
    9   0.728141  50.945174  2
    10  0.388115  47.879653  1
    11  0.960172  49.680258  0
    12  0.015216  50.067968  0
    13  0.495024  50.286287  1
    14  0.565954  49.909771  1
    15  0.992279  49.009696  1
    16  0.179934  49.554256  0
    17  0.521243  47.854791  0
    18  0.551241  51.076262  1
    19  0.713271  49.418503  0
    20  0.801716  50.660304  1
    

    With docs:

    In [475]: com.convert_robj?
    Type:       function
    String Form:<function convert_robj at 0x13e85848>
    File:       /mnt/epd/7.3-2_pandas0.12/lib/python2.7/site-packages/pandas/rpy/common.py
    Definition: com.convert_robj(obj, use_pandas=True)
    Docstring:
    Convert rpy2 object to a pandas-friendly form
    
    Parameters
    ----------
    obj : rpy2 object
    
    Returns
    -------
    Non-rpy data structure, mix of NumPy and pandas objects
    
    0 讨论(0)
  • 2020-12-24 02:26

    As suggested by lgautier, it can be done with pandas2ri.

    Here is sample code for convert rpy dataframe (rdf) to pandas dataframe (pd_df):

    from rpy2.robjects import pandas2ri
    
    pd_df = pandas2ri.ri2py_dataframe(rdf)
    
    0 讨论(0)
提交回复
热议问题