1

我很难找出在 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 提出的解决方案是我想要的,但是由于数据量大,我遇到了内存错误。有关如何优化此过程的任何建议?

4

2 回答 2

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
于 2013-10-04T17:15:58.610 回答
-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
于 2013-10-04T17:05:06.120 回答