当前位置: 首页 > 知识库问答 >
问题:

我如何能有效地保存在hdf5中的python熊猫数据帧,并在R中打开它作为数据帧?

屠和洽
2023-03-14

我认为标题涵盖了这个问题,但要阐明:

pandas python包有一个DataFrame数据类型,用于在python中保存表数据。它还有一个方便的hdf5文件格式接口,因此数据帧(和其他数据)可以使用简单的类似dict的接口保存(假设您安装了pytables)

import pandas 
import numpy
d = pandas.HDFStore('data.h5')
d['testdata'] = pandas.DataFrame({'N': numpy.random.randn(5)})
d.close()

到目前为止还不错。然而,如果我尝试加载相同的hdf5到R我看到事情不是那么简单:

> library(hdf5)
> hdf5load('data.h5')
NULL
> testdata
$block0_values
         [,1]      [,2]      [,3]       [,4]      [,5]
[1,] 1.498147 0.8843877 -1.081656 0.08717049 -1.302641
attr(,"CLASS")
[1] "ARRAY"
attr(,"VERSION")
[1] "2.3"
attr(,"TITLE")
[1] ""
attr(,"FLAVOR")
[1] "numpy"

$block0_items
[1] "N"
attr(,"CLASS")
[1] "ARRAY"
attr(,"VERSION")
[1] "2.3"
attr(,"TITLE")
[1] ""
attr(,"FLAVOR")
[1] "numpy"
attr(,"kind")
[1] "string"
attr(,"name")
[1] "N."

$axis1
[1] 0 1 2 3 4
attr(,"CLASS")
[1] "ARRAY"
attr(,"VERSION")
[1] "2.3"
attr(,"TITLE")
[1] ""
attr(,"FLAVOR")
[1] "numpy"
attr(,"kind")
[1] "integer"
attr(,"name")
[1] "N."

$axis0
[1] "N"
attr(,"CLASS")
[1] "ARRAY"
attr(,"VERSION")
[1] "2.3"
attr(,"TITLE")
[1] ""
attr(,"FLAVOR")
[1] "numpy"
attr(,"kind")
[1] "string"
attr(,"name")
[1] "N."

attr(,"TITLE")
[1] ""
attr(,"CLASS")
[1] "GROUP"
attr(,"VERSION")
[1] "1.0"
attr(,"ndim")
[1] 2
attr(,"axis0_variety")
[1] "regular"
attr(,"axis1_variety")
[1] "regular"
attr(,"nblocks")
[1] 1
attr(,"block0_items_variety")
[1] "regular"
attr(,"pandas_type")
[1] "frame"

这就引出了我的问题:理想的情况下,我能够从R到熊猫来回地拯救它们。很明显,我可以编写一个从pandas到R的包装器(我认为……虽然我认为如果我使用pandas多索引,可能会变得更加棘手),但我认为我不能轻松地在pandas中使用这些数据。有什么建议吗?

额外的好处:我真正想做的是在R中使用data.table包和熊猫数据帧(两个包中的键控方法可疑地相似)。任何关于那个的帮助都非常感激。

共有3个答案

桑鸿志
2023-03-14

我建议使用由Wes和Hadley构建的feather来解决在R和Python之间有效传输数据的问题。

python

import numpy as np
import pandas as pd
import feather as ft

df = pd.DataFrame({'N': np.random.randn(5)})
ft.write_dataframe(df, 'df.feather')

R

library(data.table)
library(feather)

dt <- data.table(read_feather("df.feather"))
dt
           N
1: 0.2777700
2: 1.4083377
3: 1.2940691
4: 0.8221348
5: 1.8552908
仲璞瑜
2023-03-14

下拉到pytable并在那里存储/获取数据是有意义的。

最终,数据帧是一系列的dict,这就是HDF5表。由于不兼容的数据类型,对转换有限制,但对于数字数据,转换应该是直接的。

熊猫存储HDF5的方式更像是一个二进制斑点。它必须支持HDF5完全支持的数据帧的所有细微差别。

https://github.com/dalejung/trtools/blob/master/trtools/io/pytables.py

有一些这样的熊猫/hdf5咀嚼代码。

晋弘义
2023-03-14

如果你还在看这个,看看google group上的这篇文章。它展示了如何通过HDF5在熊猫/R之间交换数据。

https://groups.google.com/forum/?fromgroups#!主题/pydata/0LR72GN9p6w

 类似资料:
  • 问题内容: 我有2个带有通用列/键(x,y)的熊猫数据框df1和df2。 我想对键(x,y)进行“(df1&not df2)”合并,这意味着我希望我的代码返回仅包含df1中而不包含df2中包含(x,y)行的数据框。 SAS具有等效功能 谁能优雅地在熊猫中复制相同的功能?如果我们可以在merge()中指定how =“ left-right”,那就太好了。 问题答案: 我刚刚升级到10天前发布的版本0

  • 我有以下代码: 输出: 还有情节。 但在绘图中使用此代码时,x轴是索引。但我想得到x轴上的日期。 如何使用测试的编号和ARI的平均值绘制日期 我想,我应该把字符串(日期)改成日期,但我不知道怎么做。 最好的

  • 假设熊猫数据帧如下所示: 如何将第三行(如row3)提取为pd数据帧?换句话说,row3.shape应该是(1,5),row3.head()应该是:

  • 问题内容: 我有一个大的数据框(几百万行)。 我希望能够对它进行分组操作,而只是按行的任意连续(最好大小相等)的子集进行分组,而不是使用各个行的任何特定属性来确定它们要进入的组。 用例:我想通过IPython中的并行映射将函数应用于每一行。哪行进入哪个后端引擎都没有关系,因为该函数一次基于一行来计算结果。(至少在概念上;实际上是矢量化的。) 我想出了这样的东西: 但这似乎很漫长,并且不能保证大小相

  • 我有一个需要一个数据帧作为输入的计算。我想对存储在扩展到51GB的netCDF文件中的数据运行此计算-目前,我一直在使用打开文件,并使用块(我的理解是,此打开的文件实际上是一个dask数组,因此一次只能将数据块加载到内存中)。但是,我似乎无法利用这种延迟加载,因为我必须将xarray数据转换为pandas数据帧才能运行我的计算——我的理解是,在这一点上,所有数据都加载到内存中(这是不好的)。 所以

  • 我有一个非常大的 pyspark 数据帧和一个较小的熊猫数据帧,我读入如下: 这两个数据帧都包含标记为“A”和“B”的列。我想创建另一个 pyspark 数据帧,其中只有 df1 中的那些行,其中“A”和“B”列中的条目出现在 中同名的列中。也就是说,使用 df2 的列“A”和“B”过滤 df1。 通常我认为这将是一个连接(通过实现),但是如何将熊猫数据帧与 pyspark 数据帧连接起来? 我负