通过使用 HDFStore 比较列来选择行

Posted

技术标签:

【中文标题】通过使用 HDFStore 比较列来选择行【英文标题】:select rows by comparing columns using HDFStore 【发布时间】:2015-02-05 21:47:22 【问题描述】:

如何通过使用 Pandas 比较 hdf5 文件中的两列来选择一些行? hdf5 文件太大而无法加载到内存中。例如,我想选择 A 列和 B 列相等的行。数据框保存在文件“mydata.hdf5”中。谢谢。

import pandas as pd
store = pd.HDFstore('mydata.hdf5')
df = store.select('mydf',where='A=B')

这不起作用。我知道 store.select('mydf',where='A==12') 会起作用。但我想比较 A 列和 B 列。示例数据如下所示:

A B C 
1 1 3
1 2 4
. . .
2 2 5
1 3 3

【问题讨论】:

这是错字吗:df = store.select('mydf',where='A=B')?不应该是:df = store.select('mydf',where='A==B') 即 2 ==s? @EdChum,感谢您的快速回复。但是'A=B'和'A==B'都可以。错误如下: c:\python33\lib\site-packages\pandas\computation\pytables.py in convert_value(self, v) 184 return TermValue(int(v), v, kind) 185 elif kind == u ('integer'): --> 186 v = int(float(v)) 187 return TermValue(v, v, kind) 188 elif kind == u('float'): ValueError: could not convert string to float: 'chr_b' 【参考方案1】:

您不能直接执行此操作,但以下操作会起作用

In [23]: df = DataFrame('A' : [1,2,3], 'B' : [2,2,2])

In [24]: store = pd.HDFStore('test.h5',mode='w')

In [26]: store.append('df',df,data_columns=True)

In [27]: store.select('df')
Out[27]: 
   A  B
0  1  2
1  2  2
2  3  2

In [28]: store.select_column('df','A') == store.select_column('df','B')
Out[28]: 
0    False
1     True
2    False
dtype: bool

这应该很有效。

【讨论】:

这适用于简单的情况。但是如果我们有更多的列要比较,如何解决呢?数据 = store.select('df', store.select_column('df','A') == store.select_column('df','B') & store.select_column('df','C') 我认为列之间的比较非常常用。但我找不到任何相关文件。 Pandas 没有实现这个功能吧? 只需将其读入内存,然后直接执行即可。这不是由 PyTables 实现的。所以没有简单的方法来做到这一点。

以上是关于通过使用 HDFStore 比较列来选择行的主要内容,如果未能解决你的问题,请参考以下文章

如何通过比较两个表中的两列来更新表中的列

如何通过分隔行和列来创建gridview?

想通过以文本格式保留所有行和列来在 C# 中创建 excel 文件

当字符串列内容长于已经存在的内容时,HDFStore.append(string, DataFrame) 失败

获取 HDF5 内容列表(Pandas HDFStore)

选择啥列来创建聚集索引