2012-08-09 70 views
7

我試圖圍繞pandas數據結構圍繞我的大腦,並嘗試在憤怒中使用它們。我已經知道groupby操作會產生一個熊貓系列對象。但我無法弄清楚如何使用最終的系列。特別是,我想要做的兩招:將具有分層索引的熊貓系列加入源數據框

1)「加入」的結果返回到初始數據幀

2)選擇基於分級指數由此帶來的一系列特定的值。

這裏有一個例子玩具一起工作:

import pandas 
df = pandas.DataFrame({'group1': ['a','a','a','b','b','b'], 
         'group2': ['c','c','d','d','d','e'], 
         'value1': [1.1,2,3,4,5,6], 
         'value2': [7.1,8,9,10,11,12] 
}) 
dfGrouped = df.groupby(["group1", "group2"] , sort=True) 

## toy function, obviously not my real function 
def fun(x): return mean(x**2) 

results = dfGrouped.apply(lambda x: fun(x.value1)) 

所以由此帶來的一系列(結果)是這樣的:

group1 group2 
a  c   2.605 
     d   9.000 
b  d   20.500 
     e   36.000 

這是有道理的。但我怎麼:

1)加入該回到原來的數據幀df

2)選擇一個值,其中,比方說,1組== 'B' &組2 == 'd'

回答

8

因此,對於剩餘的#1。

In [9]: df 
Out[9]: 
    group1 group2 value1 value2 
0  a  c  1.1  7.1 
1  a  c  2.0  8.0 
2  a  d  3.0  9.0 
3  b  d  4.0 10.0 
4  b  d  5.0 11.0 
5  b  e  6.0 12.0 

In [10]: results 
Out[10]: 
group1 group2 
a  c   2.605 
     d   9.000 
b  d   20.500 
     e   36.000 

In [11]: df.set_index(['group1', 'group2'], inplace=True)['results'] = results 

In [12]: df 
Out[12]: 
       value1 value2 results 
group1 group2 
a  c   1.1  7.1 2.605 
     c   2.0  8.0 2.605 
     d   3.0  9.0 9.000 
b  d   4.0 10.0 20.500 
     d   5.0 11.0 20.500 
     e   6.0 12.0 36.000 

In [13]: df.reset_index() 
Out[13]: 
    group1 group2 value1 value2 results 
0  a  c  1.1  7.1 2.605 
1  a  c  2.0  8.0 2.605 
2  a  d  3.0  9.0 9.000 
3  b  d  4.0 10.0 20.500 
4  b  d  5.0 11.0 20.500 
5  b  e  6.0 12.0 36.000 
+1

看起來正是我想要做的。這是如何設置索引的一個很好的例子。我沒有意識到這是如何工作的。 – 2012-08-09 15:16:46

+0

@ wouter-overmeire - 非常好。今天我一直在努力。 – John 2012-11-13 09:19:02

+0

@ wouter-overmeire,@ jd-long - 如果必須將多個結果添加回DataFrame,這將如何工作。例如,兩個單獨功能的結果如何?將def UCL(x):return mean(x2)+ np.std * 2'和'def LCL(x):return mean(x2)-np.std * 2'傳回給df?或者,還有更好的方法? – John 2012-11-13 09:49:40

3

雖然胡鬧左右,我發現了答案#2:

results["b","d"]給我的值,其中1組== 'b' &組2 == 'd'