2014-03-06 65 views
1

是否有類似於將函數應用於組(一次所有列)並返回對象的「變換」方法?我嘗試的任何東西似乎都會返回組中的每個列的一個對象。pandas groupby應用帶N列框架並返回對象的函數

例如,考慮數據

   Maturity    Date  s Term Month 
0 2012-02-01 00:00:00 2012-01-03 00:00:00 2.993 29  2 
18 2012-03-01 00:00:00 2012-01-03 00:00:00 3.022 58  3 
57 2012-04-01 00:00:00 2012-01-03 00:00:00 3.084 89  4 
117 2012-05-01 00:00:00 2012-01-03 00:00:00 3.138 119  5 
... 

,並假設我做了GROUPBY日期和應用一些功能由(期限,月,S)標記的組。結果應該是像

   Maturity    result 
2012-02-01 00:00:00 2012-01-03   object 
2012-03-01 00:00:00 2012-01-03   object 
2012-04-01 00:00:00 2012-01-03   object 
.... 

我可以明明只是通過遍歷組和彙總結果,但我想我只是缺少明顯的東西有關如何使用的變換方法之一。

回答

3

您可以應用該功能,然後手動聚合每個組。例如,假設聚集是一個均值和功能是列的總和,你可以:

df.groupby("Date")['Term', 'Month', 's'].apply(lambda rows: np.mean(rows['Term'] + rows['Month'] + rows['s'])) 

因此,如果我們假設一個fit方法是建立從具有「月」的列的數據幀的一些模型, 「有效期」 和 「s」:

import pandas as pd 
import numpy as np 

def fit (dataframe): 
    return { "param1": np.mean(dataframe["Term"]) + np.max(dataframe["month"]), "param2": np.std(dataframe["s"])} 

和含那些colummns爲一束的日期的數據幀:

df = pd.DataFrame({"date": ["20140101", "20140202", "20140203"] * 4, "Term" : np.random.randint(100, size=12),"month": np.random.randint(12, size=12),"s": np.random.rand(12)*3}) 
print df 

(輸出:)

Term  date month   s 
0  24 20140101  6 2.364798 
1  43 20140202  9 0.066188 
2  59 20140203  6 1.078052 
3  40 20140101  3 1.982825 
4  34 20140202  4 2.089518 
5  20 20140203  1 2.412956 
6  84 20140101  8 0.779843 
7  62 20140202  9 0.918860 
8  32 20140203  11 2.613289 
9  16 20140101  9 0.788347 
10 23 20140202  6 0.982986 
11 27 20140203  1 0.658260 

然後我們就可以對所有列應用的配合()一次爲每一組行:

modelPerDate = df.groupby("date").apply(fit) 
print modelPerDate 

其產生的模型一個數據幀,每個日期:

date 
20140101 {'param2': 0.70786647858131047, 'param1': 50.0} 
20140202 {'param2': 0.71852297283637756, 'param1': 49.5} 
20140203 {'param2': 0.83876295773013798, 'param1': 45.5} 
+0

這是一個像'適合'的功能。不容易分解,如'+'。 – mathtick

+0

apply()中收到的參數是一個數據框,包含一個組的行和['Term','Month','s']選擇的列,是否可以對此運行fit方法?然後,您應該獲得一個適合每個日期的「對象」。 我的例子中的「+」是添加列,然後平均值將結果列表聚合爲單個結果。 – Svend

+0

我應該提到我可以使用'apply'或'agg'函數,但它爲每列返回相同(冗餘)的對象。因此,看起來我的函數每次都會接收到完整的組(這是我想要的),但是對於組中的每一列(或者至少這是結果的填充方式)它將被調用一次。 – mathtick

相關問題