2017-03-03 60 views
2
通過自己的功能概括

讓DF是我們從大熊貓的測試數據框中:如何通過列組和在Python

import pandas as pd 
import numpy as np 

df = pd.DataFrame({'A' : ['foo', 'bar', 'foo', 'bar','foo', 'bar', 'foo', 'foo'], 
        'B' : ['one', 'one', 'two', 'three','two', 'two', 'one', 'three'], 
        'C' : np.random.randn(8), 
        'D' : np.random.randn(8)}) 

我想現在做實際上是通過假設組列A,是這樣的:

df.groupby(['A'])['C'].sum() 

工作正常。現在,我不想使用sum(),而是希望應用自己的函數以有效的方式彙總數據。

R中的等價物是:

require(plyr); require(dplyr) 

df = data.frame(A = c('foo', 'bar', 'foo', 'bar','foo', 'bar', 'foo', 'foo'), 
       B = c('one', 'one', 'two', 'three','two', 'two', 'one', 'three'), 
       C = rnorm(8), 
       D = rnorm(8)) 

與例如這個函數調用myfun

myfun <- function(x){sum(x**2)} 

則:

df %>% 
    group_by(A) %>% 
    summarise(result = myfun(C)) 

我希望這個問題是很清晰。非常感謝!

回答

3

您可以使用agg並將您的自定義函數放置在lambda中,例如,

>>> df.groupby('A').C.agg(lambda x: x.pow(2).sum()) 
A 
bar 3.787664 
foo 2.448404 
Name: C, dtype: float64 

或者你可以單獨定義它並將它傳遞給agg

def sum2(x): 
    return x.pow(2).sum() 


>>> df.groupby('A').C.agg(sum2) 
A 
bar 3.787664 
foo 2.448404 
Name: C, dtype: float64 

還要注意,agg接受了很多東西的函數參數,所以它是相當靈活的。 From the docs,用於彙總組arg功能可以在瞬間是:

  • 字符串cythonized函數名
  • 功能
  • 的功能列表中的列
  • 字典 - >功能
  • 嵌套字典的名字 - >功能的指令
+0

非常感謝你的作品.. – Codutie

+0

@Codutie不客氣! – miradulo

+0

@Codutie,df.apply也適用於這種情況。 – ivan7707