gpt4 book ai didi

python - 如何在 Rpy2 中使用 pandas 数据帧和 numpy 数组?

转载 作者:太空狗 更新时间:2023-10-29 17:43:26 27 4
gpt4 key购买 nike

我想将 pandas 与 numpy 一起用于我的所有分析,但使用 Rpy2 来绘制我的数据。我想使用 pandas 数据帧进行所有分析,然后通过 rpy2 使用 R 的完整绘图来绘制这些。 py2,并且正在使用 ipython 进行绘图。执行此操作的正确方法是什么?

我尝试的几乎所有命令都失败了。例如:

  • 我正在尝试绘制 pandas DataFrame df 两列之间的散点图。我希望在 x/y 轴中使用 df 的标签,就像它是 R 数据帧时一样。有没有办法做到这一点?当我尝试使用 r.plot 执行此操作时,我得到了这个乱码图:

In: r.plot(df.a, df.b) # df 是 pandas DataFrame

产量:

输出:rpy2.rinterface.NULL

导致情节:

enter image description here

如您所见,轴标签乱七八糟,它没有像应该的那样从 DataFrame 读取轴标签(X 轴是 dfa 列Y 轴是 b 列)。

  • 如果我尝试使用 r.hist 制作直方图,它根本不起作用,并产生错误:

    In: r.hist(df.a)
    Out:
    ...
    vectors.pyc in <genexpr>((x,))
    293 if l < 7:
    294 s = '[' + \
    --> 295 ', '.join((p_str(x, max_width = math.floor(52 / l)) for x in self[ : 8])) +\
    296 ']'
    297 else:

    vectors.pyc in p_str(x, max_width)
    287 res = x
    288 else:
    --> 289 res = "%s..." % (str(x[ : (max_width - 3)]))
    290 return res
    291

    TypeError: slice indices must be integers or None or have an __index__ method

导致这个情节:

enter image description here

知道错误是什么意思吗?在这里,轴又乱七八糟,乱七八糟的数据。

编辑:此错误仅在使用 ipython 时发生。当我从脚本运行命令时,它仍然会产生有问题的图,但至少运行时没有错误。从 ipython 调用这些命令一定有问题。

  • 我还尝试按照下面海报的建议将 pandas DataFrame df 转换为 R DataFrame,但也失败并出现此错误:

    com.convert_to_r_dataframe(mydf) # mydf is a pandas DataFrame
    ----> 1 com.convert_to_r_dataframe(mydf)
    in convert_to_r_dataframe(df, strings_as_factors)
    275 # FIXME: This doesn't handle MultiIndex
    276
    --> 277 for column in df:
    278 value = df[column]
    279 value_type = value.dtype.type

    TypeError: iteration over non-sequence

我怎样才能让这些基本的绘图功能在 Pandas DataFrame 上工作(从 Pandas DataFrame 的标签中读取绘图标签),并让 Pandas DF 到 R DF 之间的转换工作?

EDIT2:这是一个 csv 文件“test.txt”(http://pastebin.ca/2311928)的完整示例和我回答@dale 评论的代码:

import rpy2
from rpy2.robjects import r
import rpy2.robjects.numpy2ri
import pandas.rpy.common as com
from rpy2.robjects.packages import importr
from rpy2.robjects.lib import grid
from rpy2.robjects.lib import ggplot2
rpy2.robjects.numpy2ri.activate()
from numpy import *
import scipy

# load up pandas df
import pandas
data = pandas.read_table("./test.txt")
# plotting a column fails
print "data.c2: ", data.c2
r.plot(data.c2)
# Conversion and then plotting also fails
r_df = com.convert_to_r_dataframe(data)
r.plot(r_df)

绘制“data.c2”列的调用失败,即使 data.c2 是 pandas df 的列,因此就所有意图和目的而言应该是一个 numpy 数组。我使用 activate() 调用,所以我认为它会将此列作为一个 numpy 数组处理并绘制它。

在转换为 R 数据帧后第二次调用绘制数据帧 data 也失败了。这是为什么?如果我从 R 加载 test.txt 作为数据框,我可以 plot() 它并且因为我的数据框已从 pandas 转换为 R,它看起来像它也应该在这里工作。

当我在 ipython 中尝试 rmagic 时,由于某种原因它没有启动绘图窗口,尽管它没有出错。 IE。如果我这样做:

In [12]: X = np.array([0,1,2,3,4])

In [13]: Y = np.array([3,5,4,6,7])
In [14]: import rpy2

In [15]: from rpy2.robjects import r

In [16]: import rpy2.robjects.numpy2ri

In [17]: import pandas.rpy.common as com

In [18]: from rpy2.robjects.packages import importr

In [19]: from rpy2.robjects.lib import grid

In [20]: from rpy2.robjects.lib import ggplot2


In [21]: rpy2.robjects.numpy2ri.activate()

In [22]: from numpy import *

In [23]: import scipy

In [24]: r.assign("x", X)
Out[24]:
<Array - Python:0x592ad88 / R:0x6110850>
[ 0, 1, 2, 3, 4]

In [25]: r.assign("y", Y)
<Array - Python:0x592f5f0 / R:0x61109b8>
[ 3, 5, 4, 6, 7]

In [27]: %R plot(x,y)

没有错误,但也没有绘图窗口。无论如何,如果可能的话,我想坚持使用 rpy2 而不是依赖 rmagic

谢谢。

最佳答案

[注意:您在“edit 2”中的代码在这里工作(Python 2.7、rpy2-2.3.2、R-1.15.2)。]

正如 @dale 提到的,每当 R 对象是匿名的(即对象不存在 R 符号)时,R deparse(substitute()) 将最终返回 structure() 的 R 对象,一个可能的解决方法是指定“xlab”和“ylab”参数;对于某些情节,您还必须指定 main(标题)。

解决此问题的另一种方法是使用 R 的公式并提供数据框(在我们计算出转换部分后,下面会详细介绍)。

忘记 pandas.rpy 中的内容。它既损坏又似乎忽略了 rpy2 中可用的功能。

较早的quick fix to conversion with ipython可以很容易地转换为适当的转换。我正在考虑在 rpy2 代码库中添加一个(有更多的功能),但与此同时,只需在代码示例中的所有导入之后添加以下代码段。每当进行 R 调用时,它都会透明地将 pandas 的 DataFrame 对象转换为 rpy2 的 DataFrame

from collections import OrderedDict
py2ri_orig = rpy2.robjects.conversion.py2ri
def conversion_pydataframe(obj):
if isinstance(obj, pandas.core.frame.DataFrame):
od = OrderedDict()
for name, values in obj.iteritems():
if values.dtype.kind == 'O':
od[name] = rpy2.robjects.vectors.StrVector(values)
else:
od[name] = rpy2.robjects.conversion.py2ri(values)
return rpy2.robjects.vectors.DataFrame(od)
elif isinstance(obj, pandas.core.series.Series):
# converted as a numpy array
res = py2ri_orig(obj)
# "index" is equivalent to "names" in R
if obj.ndim == 1:
res.names = ListVector({'x': ro.conversion.py2ri(obj.index)})
else:
res.dimnames = ListVector(ro.conversion.py2ri(obj.index))
return res
else:
return py2ri_orig(obj)
rpy2.robjects.conversion.py2ri = conversion_pydataframe

现在下面的代码将“正常工作”:

r.plot(rpy2.robjects.Formula('c3~c2'), data)
# `data` was converted to an rpy2 data.frame on the fly
# and the a scatter plot c3 vs c2 (with "c2" and "c3" the labels on
# the "x" axis and "y" axis).

我还注意到您正在导入 ggplot2,但没有使用它。目前转换必须明确要求。例如:

p = ggplot2.ggplot(rpy2.robjects.conversion.py2ri(data)) +\
ggplot2.geom_histogram(ggplot2.aes_string(x = 'c3'))
p.plot()

关于python - 如何在 Rpy2 中使用 pandas 数据帧和 numpy 数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14656852/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com