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