当前位置: 首页 > 面试题库 >

熊猫对HDFStore中的大数据进行“分组依据”查询?

仲孙焱
2023-03-14
问题内容

我有大约700万行,HDFStore其中有60列以上。数据超出了我的内存容量。我正在基于列“
A”的值将数据聚合到组中。熊猫拆分/汇总/合并的文档假定我已经将所有数据都存储在了DataFrame,但是我无法将整个商店读取到内存中DataFrame。在分组数据的正确方法是HDFStore什么?


问题答案:

这是一个完整的例子。

import numpy as np
import pandas as pd
import os

fname = 'groupby.h5'

# create a frame
df = pd.DataFrame({'A': ['foo', 'foo', 'foo', 'foo',
                         'bar', 'bar', 'bar', 'bar',
                         'foo', 'foo', 'foo'],
                   'B': ['one', 'one', 'one', 'two',
                         'one', 'one', 'one', 'two',
                         'two', 'two', 'one'],
                   'C': ['dull', 'dull', 'shiny', 'dull',
                         'dull', 'shiny', 'shiny', 'dull',
                         'shiny', 'shiny', 'shiny'],
                   'D': np.random.randn(11),
                   'E': np.random.randn(11),
                   'F': np.random.randn(11)})


# create the store and append, using data_columns where I possibily
# could aggregate
with pd.get_store(fname) as store:
    store.append('df',df,data_columns=['A','B','C'])
    print "store:\n%s" % store

    print "\ndf:\n%s" % store['df']

    # get the groups
    groups = store.select_column('df','A').unique()
    print "\ngroups:%s" % groups

    # iterate over the groups and apply my operations
    l = []
    for g in groups:

        grp = store.select('df',where = [ 'A=%s' % g ])

        # this is a regular frame, aggregate however you would like
        l.append(grp[['D','E','F']].sum())


    print "\nresult:\n%s" % pd.concat(l, keys = groups)

os.remove(fname)

输出量

store:
<class 'pandas.io.pytables.HDFStore'>
File path: groupby.h5
/df            frame_table  (typ->appendable,nrows->11,ncols->6,indexers->[index],dc->[A,B,C])

df:
      A    B      C         D         E         F
0   foo  one   dull -0.815212 -1.195488 -1.346980
1   foo  one   dull -1.111686 -1.814385 -0.974327
2   foo  one  shiny -1.069152 -1.926265  0.360318
3   foo  two   dull -0.472180  0.698369 -1.007010
4   bar  one   dull  1.329867  0.709621  1.877898
5   bar  one  shiny -0.962906  0.489594 -0.663068
6   bar  one  shiny -0.657922 -0.377705  0.065790
7   bar  two   dull -0.172245  1.694245  1.374189
8   foo  two  shiny -0.780877 -2.334895 -2.747404
9   foo  two  shiny -0.257413  0.577804 -0.159316
10  foo  one  shiny  0.737597  1.979373 -0.236070

groups:Index([bar, foo], dtype=object)

result:
bar  D   -0.463206
     E    2.515754
     F    2.654810
foo  D   -3.768923
     E   -4.015488
     F   -6.110789
dtype: float64

一些警告:

1)如果您的组密度相对较低,则此方法很有意义。大约数百或数千个组。如果获得的收益更多,则效率更高(但方法更复杂),并且您正在应用的函数(在这种情况下sum)将变得更加严格。

本质上,您将按块对整个商店进行迭代,然后按组进行分组,但将组仅进行半折叠(想象一下是做一个均值,因此您需要保持运行总数和运行计数,然后在最后进行除法)
。因此,某些操作会有些棘手,但可能会处理许多组(而且速度非常快)。

2)可以通过保存坐标(例如组位置,但是稍微复杂一点)来提高效率。

3)上面的方案无法进行多重分组(有可能,但是需要一种类似于2的方法)

4)您要分组的列,必须是data_column!

5)您可以在选择的btw中组合您想要的任何其他过滤器(这是进行多组btw的时髦方法,您仅在它们的乘积上形成2个唯一的group和iterator列表,如果有很多,效率就不是很高组,但可以工作)

高温超导

让我知道这是否适合您



 类似资料:
  • 问题内容: 我有一个非常希望直截了当的问题,在最近3个小时中,这一直给我带来很多困难。应该很容易。 这是挑战。 我有一个熊猫数据框: 我想要将数据框转换为: 值是值计数。有人有见识吗?谢谢! 问题答案: 这是重塑数据的几种方法 1) 使用 2) 或者,在over上使用,然后填充零。 3) 或者使用与, 4) 或者,与

  • 问题内容: 我想对以下数据框进行排序: 我想对它进行排序,以便根据列表对LSE列进行重新排序: 当然,其他列也需要相应地重新排序。有没有办法在熊猫里做到这一点? 问题答案: pandas0.15版中对s的改进支持使您可以轻松做到这一点: 如果这只是临时排序,则可能不希望将LSE列保留为a ,但是如果您希望这种排序能够在不同的上下文中使用几次,则是一个很好的解决方案。 在更高版本的,中,已被替换为,

  • 问题内容: 如何对pandas groupby操作应用排序?下面的命令返回一个错误,指出“布尔”对象不可调用 问题答案: 通常,排序是在groupby键上执行的,并且您发现您无法调用groupby对象,您可以做的是调用并传递函数并将列作为kwarg参数传递: 另外,您可以在分组之前对df进行排序: 更新资料 对于不建议使用的版本,请参见docs,现在应使用: 在这里在评论中添加@xgdgsc的答案

  • 问题内容: 我有两个表(1&2)应该合并到第三(3)个表中。 表1:F_Number,A_Number, A_Weight 表2:A_Number,A_Country表3:F_Number,A_Country,A_Weight 第三表应按F_Number分组,求和A_Weight,其中A_Country具有相同的值。到目前为止,表的联接工作正常: 结果是一个像这样的表: F_Number; 一个国

  • 问题内容: 假设我有一个熊猫数据框: 我想计算数据框的列均值。 这很简单: 然后按列范围max(col)-min(col)。这又很容易: 现在,对于每个元素,我要减去其列的均值并除以其列的范围。我不确定该怎么做 任何帮助/指针将不胜感激。 问题答案:

  • 问题内容: 我有一个熊猫数据框,如下所示: 我想按它排序,但该列只是一个。 我试图将列设置为日期对象,但是遇到了一种格式不需要的格式的问题。所需的格式为等。 因此,现在我试图找出如何使numpy将“美国”日期转换为ISO标准,以便可以使它们成为日期对象,以便可以对它们进行排序。 我该如何将这些美国日期转换为ISO标准,或者我在熊猫中缺少更直接的方法? 问题答案: 您可以用来转换为日期时间对象。它带