14

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

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

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

到目前为止,一切都很好。但是,如果我尝试将相同的 hdf5 加载到 RI 中,就会发现事情并不那么简单:

> 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 来回保存。我显然可以写一个从 pandas 到 R 的包装器(我认为......虽然我认为如果我使用 pandas MultiIndex可能会变得更棘手),但我认为我不能轻易地在 pandas 中使用该数据。有什么建议么?

奖励:我真正想做的是将 R 中的data.table包与 pandas 数据框一起使用(这两个包中的键控方法可疑地相似)。对此的任何帮助都非常感谢。

4

5 回答 5

8

如果你还在看这个,看看谷歌群组上的这篇文章。它展示了如何通过 HDF5 在 pandas/R 之间交换数据。

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

于 2013-01-18T20:45:51.937 回答
3

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

最终,DataFrame 是 Series 的字典,这就是 HDF5 表。由于不兼容的 dtypes,翻译存在限制,但对于数字数据,它应该是直截了当的。

pandas 存储其 HDF5 的方式更像是二进制 blob。它必须支持 HDF5 完全支持的 DataFrame 的所有细微差别。

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

有一些那种 pandas/hdf5 munging 代码。

于 2012-09-05T18:18:16.660 回答
2

如何在 HDF5 中编写数据帧以便可以在 R 中读取它现在位于 Pandas 文档中:http: //pandas-docs.github.io/pandas-docs-travis/io.html#external-compatibility

于 2013-06-24T16:06:15.860 回答
2

我推荐使用由 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
于 2016-09-30T15:06:28.383 回答
-1

您可以使用csv文件作为通用数据格式。R 和 python pandas 都可以轻松使用它。您可能会失去一些精度,但如果这是一个问题取决于您的具体问题。

于 2012-09-05T09:51:14.880 回答