gpt4 book ai didi

python - MultiIndex 数据帧的 Pandas HDFStore : how to efficiently get all indexes

转载 作者:太空狗 更新时间:2023-10-30 00:56:33 25 4
gpt4 key购买 nike

在 Pandas 中,有没有一种方法可以高效地以表格格式提取 HDFStore 中存在的所有 MultiIndex 索引?

我可以使用 where= 高效地 select(),但我想要所有索引,而不需要任何列。我还可以使用 iterator=True select() 来节省 RAM,但这仍然意味着要从磁盘读取几乎所有表,所以它仍然很慢。

我一直在 store.root..table.* 中寻找东西,希望我能得到一个索引值列表。我走在正确的轨道上吗?

B 计划是保留一个较短的 MultiIndex DataFrame,它只包含每次附加主 DataFrame 时附加的空 DataFrame。我可以检索它并获得比主要索引便宜得多的索引。虽然不优雅。

最佳答案

创建多索引df

In [35]: df = DataFrame(randn(100000,3),columns=list('ABC'))

In [36]: df['one'] = 'foo'

In [37]: df['two'] = 'bar'

In [38]: df.ix[50000:,'two'] = 'bah'

In [40]: mi = df.set_index(['one','two'])

In [41]: mi
Out[41]:
<class 'pandas.core.frame.DataFrame'>
MultiIndex: 100000 entries, (foo, bar) to (foo, bah)
Data columns (total 3 columns):
A 100000 non-null values
B 100000 non-null values
C 100000 non-null values
dtypes: float64(3)

存储为表格

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

In [43]: store.append('df',mi)

get_storer 将返回存储的对象(但不检索数据)

In [44]: store.get_storer('df').levels
Out[44]: ['one', 'two']

In [2]: store
Out[2]:
<class 'pandas.io.pytables.HDFStore'>
File path: test.h5
/df frame_table (typ->appendable_multi,nrows->100000,ncols->5,indexers->[index],dc->[two,one])

索引级别创建为 data_columns,这意味着您可以在选择中使用它们这是只选择索引的方法

In [48]: store.select('df',columns=['one'])
Out[48]:
<class 'pandas.core.frame.DataFrame'>
MultiIndex: 100000 entries, (foo, bar) to (foo, bah)
Empty DataFrame

选择单个列并将其作为中间帧返回

In [49]: store.select('df',columns=['A'])
Out[49]:
<class 'pandas.core.frame.DataFrame'>
MultiIndex: 100000 entries, (foo, bar) to (foo, bah)
Data columns (total 1 columns):
A 100000 non-null values
dtypes: float64(1)

选择单个列作为系列(也可以是索引,因为它们存储为列)。这会非常快。

In [2]: store.select_column('df','one')
Out[2]: 
0     foo
1     foo
2     foo
3     foo
4     foo
5     foo
6     foo
7     foo
8     foo
9     foo
10    foo
11    foo
12    foo
13    foo
14    foo
...
99985    foo
99986    foo
99987    foo
99988    foo
99989    foo
99990    foo
99991    foo
99992    foo
99993    foo
99994    foo
99995    foo
99996    foo
99997    foo
99998    foo
99999    foo
Length: 100000, dtype: object

如果你真的想要最快的只选择索引

In [4]: %timeit store.select_column('df','one')
100 loops, best of 3: 8.71 ms per loop

In [5]: %timeit store.select('df',columns=['one'])
10 loops, best of 3: 43 ms per loop

或者获取完整的索引

In [6]: def f():
...: level_1 = store.select_column('df','one')
...: level_2 = store.select_column('df','two')
...: return MultiIndex.from_arrays([ level_1, level_2 ])
...:

In [17]: %timeit f()
10 loops, best of 3: 28.1 ms per loop

如果您想要每个级别的值,这是一种非常快速的方法

In [2]: store.select_column('df','one').unique()
Out[2]: array(['foo'], dtype=object)

In [3]: store.select_column('df','two').unique()
Out[3]: array(['bar', 'bah'], dtype=object)

关于python - MultiIndex 数据帧的 Pandas HDFStore : how to efficiently get all indexes,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17652182/

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