在Pandas中按组标准对数据进行子集

时间:2013-10-04 16:49:29

标签: python pandas

我很难找到在Pandas中对大型数据集进行子集化的最佳方法,但是我对大熊猫的经验是有限的。

我的数据由4列和约4亿行组成。列表示日期时间,X位置,Y位置,然后是有关该点的一些信息。我的目标是通过X,Y对将DataFrame子集化,其值'Stuff'至少超过一次阈值。为了清楚起见,我想要识别所有X,Y对的实例,而不仅仅是那些超过阈值的实例。显然,这需要以内存有效的方式完成。我应该提一下,数据目前按日期编制索引(尽管日期不是唯一的)。

例如,如果这是我的数据:

In [6]: data
Out[6]: 
            Stuff   X  Y
Date                    
2004-01-01    2.3  10  3
2004-01-02    5.6  20  2
2004-01-02   14.9  30  4
2004-01-02   10.2  10  3
2004-01-03    3.1  30  4
2004-01-04    2.9  10  5
2004-01-05    3.4  20  4

我的阈值为10,我希望得到以下结果,因为10,3和30,4对都有一个超过阈值的'Stuff'实例:

In [7]: data
Out[7]: 
            Stuff   X  Y
Date                    
2004-01-01    2.3  10  3
2004-01-02   14.9  30  4
2004-01-02   10.2  10  3
2004-01-03    3.1  30  4

任何提示将不胜感激。我怀疑我可能需要在X,Y上将索引更改为MultiIndex,但我不确定。我也研究过使用groupby(['X','Y'])。max但我不相信我可以使用这些结果对原始数据框进行子集化。

问题更新 @jsexauer提出的解决方案是我想要的,但由于数据量很大,我遇到了内存错误。有关如何优化此过程的任何建议?

2 个答案:

答案 0 :(得分:1)

你的预感是正确的,你需要使用多索引:

>>> df = df.reset_index()
>>> df = df.set_index(['X','Y'])
>>> df.ix[ df[df['Stuff']>10].index.unique() ]
            Date  Stuff
X  Y                   
30 4  2004-01-02   14.9
   4  2004-01-03    3.1
10 3  2004-01-01    2.3
   3  2004-01-02   10.2

答案 1 :(得分:-1)

您可以通过定义条件来选择,

df[df.stuff > 10]

==========编辑添加实际运行的截图=======================

idx = ['2004-01-02','2004-01-02','2004-01-02','2004-01-03','2004-01-04','2004-01-05','2004-01-05']
import pandas
df = pandas.DataFrame(index = idx)
df['x'] = [ 10,20,30,10,30,10,20]
df['y'] = [ 4,5,6,7,3,5,7]
df['stuff'] = [2.6,5.6,14.9,10.2,3.1,2.9,3.4]
print df

产量,

             x  y
2004-01-02  10  4
2004-01-02  20  5
2004-01-02  30  6
2004-01-03  10  7
2004-01-04  30  3
2004-01-05  10  5
2004-01-05  20  7

要选择条件,请执行

df[df.stuff > 10]

这会产生,

                 x   y  stuff
2004-01-02   30  6   14.9
2004-01-03   10  7   10.2