2015-05-29 30 views
1

我有一個熊貓數據幀,看起來在本質上類似如下:有效的方式來反覆提取行集團在熊貓

Group Date Value etc. 
1  01/01 10 
1  05/01 10 
1  08/01 5 
1  15/01 5 
1  18/01 2 
1  21/01 10 
... 
2  02/01 3 
2  15/01 4 
2  25/01 1 
... 
3  01/01 6 
.... 

我想提取每個Group包含在所有行單獨大熊貓數據幀組(例如,帶有按鍵1,2,3等的字典)。執行此操作的顯而易見的方法是使用循環遍歷組的切片(如df[df.Group == 1])。

但是,對於非常大的數據集(700k行,有30k個組),切片技術非常慢,因爲必須爲每個30k組訪問整個700k事務。

有關快速方法的任何建議,每個700k行只需訪問一次即可執行分組?謝謝!

+1

爲什麼你需要它在不同的數據集? –

+0

我需要對每組行執行一系列操作,並且只需要來自該組的行。否則,我會在整個集合上重複執行切片操作。 – David

回答

2

我不知道爲什麼你要爲每個組單獨的DF,我只是groupby的「組」並使用groups屬性索引回原稿DF,或使用get_group

In [79]: 
groups = df.groupby('Group') 
groups.groups 

Out[79]: 
{1: [0, 1, 2, 3, 4, 5], 2: [6, 7, 8], 3: [9]} 

In [81]:  
groups.get_group(1) 

Out[81]: 
    Group Date Value 
0  1 01/01  10 
1  1 05/01  10 
2  1 08/01  5 
3  1 15/01  5 
4  1 18/01  2 
5  1 21/01  10 

In [82]:  
df.loc[groups.groups[1]] 

Out[82]: 
    Group Date Value 
0  1 01/01  10 
1  1 05/01  10 
2  1 08/01  5 
3  1 15/01  5 
4  1 18/01  2 
5  1 21/01  10 
+0

非常優雅,我不知道'groups.get_group(...)' – UNagaswamy

+0

奇妙的是,'get_group'正是我所期待的!謝謝。 – David

1

您可以在Group列上使用groupby。這將讓你的所有組,你將能夠將每個組處理與功能 -

df.groupby('Group').<apply function here> 

例如 -

In [13]: df 
Out[13]: 
    Group Date Value 
0  1 01/01  10 
1  1 05/01  10 
2  1 08/01  5 
3  1 15/01  5 
4  1 18/01  2 
5  1 21/01  10 
6  2 15/01  5 
7  2 18/01  2 
8  1 21/01  10 
9  1 15/01  5 
10  5 18/01  2 
11  5 21/01  10 

In [14]: df.groupby('Group').groups 
Out[14]: {1: [0, 1, 2, 3, 4, 5, 8, 9], 2: [6, 7], 5: [10, 11]} 

In [15]: grp = df.groupby('Group') 

這可以讓你的組1:

In [16]: grp.get_group(1) 
Out[16]: 
    Group Date Value 
0  1 01/01  10 
1  1 05/01  10 
2  1 08/01  5 
3  1 15/01  5 
4  1 18/01  2 
5  1 21/01  10 
8  1 21/01  10 
9  1 15/01  5 

這裏的文檔將幫助你進一步 - http://pandas.pydata.org/pandas-docs/dev/groupby.html

+0

非常感謝:-)我之所以選擇上面的答案是因爲它首先出現,但那正是我所期待的。 – David