2017-01-28 74 views
1

我有一個大的二維數據幀是這樣的: 日期,USER_ID,VAL1,VAL2使用字典數據幀聚集

正如我需要計算複雜的功能對每個USER_ID,我執行以下操作:

for x in user_id_list : 
    dfi= df[ user_id= xx]  
    user_dict[x]['Newmycolname']= my_fun(dfi) 
    user_dict[x]['Newmycolname2']= my_fun2(dfi) 

# map the user_dict to df after 

這不是非常有效但非常靈活,因爲我可以計算子df(dfi)上函數的任何種類 。此外,該代碼可以很容易地平行.... 在速度快的代價......

有沒有一種方法,以取代循環,由大熊貓的請求grouby.agg 和創造新的列名?

回答

1

是的,你可以在每個組轉換使用pandas.DataFrame.groupbypandas.DataFrame.applypandas.Series

>>> df.groupby('user_id') 
     .apply(lambda x: pd.Series(data=[my_fun(x), my_fun2(x)], index=['Newmycolname', 'Newmycolname2'])) 
     Newmycolname Newmycolname2 
user_id        
1     3.5   17.0 
2     6.0   20.0 

沒有lambda函數,只是爲了給更清楚的瞭解這是怎麼回事:

>>> def worker(x): 
...  d = [my_fun(x), my_fun2(x)] 
...  i = ['Newmycolname', 'Newmycolname2'] 
...  return pd.Series(data=d, index=i) 
... 
>>> df.groupby('user_id').apply(worker) 
     Newmycolname Newmycolname2 
user_id        
1     3.5   17.0 
2     6.0   20.0 
+1

你後馬上回答我說他們的問題令人困惑;-) – piRSquared

+0

@piRSquared謝謝,我不得不首先刷新我的熊貓技能 - 不幸的是,我最近並沒有花太多時間用python。 –