2016-06-06 16 views
3

in sql查詢看起來像select id, avg(x), avg(y), max(x), max(y) from table group by id 它可以在熊貓數據框中轉換爲單個操作嗎? 我可以得到每個函數的結果一樣將操作應用於具有多列結果的多個列中

mydf['center_x'] = mydf.groupby('id')['x'].mean() 
mydf['center_y'] = mydf.groupby('id')['y'].mean() 

但它是相同的操作過度號召,再加上過多的存儲需求(myDF上是巨大的)。除了最終獲得獨一無二的設置還有點麻煩。

任何想法?

+0

'agg'絕對是答案,但是關於您最後的聲明:您可以('g = df.groupby('id')'),然後在需要時調用函數('g ['x']。mean()'等等),您不需要每次都進行分組 – ayhan

回答

4

是的,支持,請參閱文檔here

從那裏舉:

In [56]: grouped = df.groupby('A') 

In [57]: grouped['C'].agg([np.sum, np.mean, np.std]) 
Out[57]: 
      sum  mean  std 
A         
bar 0.443469 0.147823 0.301765 
foo 2.529056 0.505811 0.966450 

也許更加適用於你的問題,你也可以做不同的列不同的功能,像這樣:

In [60]: grouped.agg({'C' : np.sum, 
    ....:    'D' : lambda x: np.std(x, ddof=1)}) 
    ....: 
Out[60]: 
      C   D 
A      
bar 0.443469 1.490982 
foo 2.529056 0.645875 

或者,一個實際的例子更接近您的原始問題:

df = pd.DataFrame({"group":list("aaaaabbbbb"), "A":np.random.rand(10), "B":np.random.rand(10)}) 
df.groupby("group").agg({"A":[np.sum, np.mean], "B":[np.sum, np.mean]}) 


    A    B 
    sum  mean sum  mean 
group    
a 1.450488 0.290098 3.526962 0.705392 
b 1.570386 0.314077 2.734465 0.546893 
+0

謝謝,Nils,看起來像一個可以結合應用於同一列的多個函數。但是對於原始示例的x和y,我仍然需要兩個選擇然後加入它們,或者它可以只是一個? – cur4so

+0

不知道我明白 - 這不是第二個例子嗎?即將一個函數應用於列「C」,並將一個函數應用於「D」列? –

+0

是否有可能在列C上有2個功能,在列D上有2個功能?是否有可能組合2個例子?一列的平均值和最大值以及另一列的平均值和最大值。在你的第二個例子中,'C'和'D'將是輸入和輸出列,或者他們必須以某種方式重新命名爲輸出 – cur4so