2016-05-12 46 views
0

我有這樣一個數據幀,它隨着時間的推移跟蹤某些項目(IDS)的值:Python:最多由另一列運行?

mytime=np.tile(np.arange(0,10) , 2) 
myids=np.repeat([123,456], [10,10]) 
myvalues=np.random.random_integers(20,30,10*2) 

df=pd.DataFrame() 
df['myids']=myids 
df['mytime']=mytime 
df['myvalues']=myvalues 



+-------+--------+----------+--+--+ 
| myids | mytime | myvalues | | | 
+-------+--------+----------+--+--+ 
| 123 | 0  | 29  | | | 
+-------+--------+----------+--+--+ 
| 123 | 1  | 23  | | | 
+-------+--------+----------+--+--+ 
| 123 | 2  | 26  | | | 
+-------+--------+----------+--+--+ 
| 123 | 3  | 24  | | | 
+-------+--------+----------+--+--+ 
| 123 | 4  | 25  | | | 
+-------+--------+----------+--+--+ 
| 123 | 5  | 29  | | | 
+-------+--------+----------+--+--+ 
| 123 | 6  | 28  | | | 
+-------+--------+----------+--+--+ 
| 123 | 7  | 21  | | | 
+-------+--------+----------+--+--+ 
| 123 | 8  | 20  | | | 
+-------+--------+----------+--+--+ 
| 123 | 9  | 26  | | | 
+-------+--------+----------+--+--+ 
| 456 | 0  | 26  | | | 
+-------+--------+----------+--+--+ 
| 456 | 1  | 24  | | | 
+-------+--------+----------+--+--+ 
| 456 | 2  | 20  | | | 
+-------+--------+----------+--+--+ 
| 456 | 3  | 26  | | | 
+-------+--------+----------+--+--+ 
| 456 | 4  | 29  | | | 
+-------+--------+----------+--+--+ 
| 456 | 5  | 29  | | | 
+-------+--------+----------+--+--+ 
| 456 | 6  | 24  | | | 
+-------+--------+----------+--+--+ 
| 456 | 7  | 21  | | | 
+-------+--------+----------+--+--+ 
| 456 | 8  | 27  | | | 
+-------+--------+----------+--+--+ 
| 456 | 9  | 29  | | | 
+-------+--------+----------+--+--+ 

我需要計算運行最大值每個ID。

np.maximum.accumulate() 

會計算運行最大值而不管id,而我需要一個類似的計算,但是每次id改變都會重置。我可以想到一個簡單的腳本來做它在numba(我有非常大的數組和非矢量化的非Numba代碼會很慢),但有沒有更簡單的方法來做到這一點?

只有兩個值,我可以運行:

df['running max']= np.hstack(( np.maximum.accumulate(df[ df['myids']==123 ]['myvalues']) , np.maximum.accumulate(df[ df['myids']==456 ]['myvalues'])) ) 

但這不是用很多很多的價值是可行的。

謝謝!

+0

[大熊貓GROUPBY](http://pandas.pydata.org/pandas-docs/stable/groupby.html) - 你可以寫,接受自己回答... – gboffi

+0

我是由myids組成的,那麼,究竟是什麼?我確信它只是我很厚,但我來自SQL背景,我真的很難圍繞熊貓(也是殘酷的文檔沒有幫助)...... –

+0

'df.groupby('myid' )['myvalues']。cummax()'非常接近,但我不知道如何繼續......'.cummax()'需要'axis ='參數,但是作爲熊貓的無知。我不知道如何使用它(反正它不完全是一個numpy'axis =') – gboffi

回答

2

在這裏你走。假設是mytime被排序。

mytime=np.tile(np.arange(0,10) , 2) 
myids=np.repeat([123,456], [10,10]) 
myvalues=np.random.random_integers(20,30,10*2) 

df=pd.DataFrame() 
df['myids']=myids 
df['mytime']=mytime 
df['myvalues']=myvalues 

groups = df.groupby('myids') 
df['run_max_group'] = groups['myvalues'].transform(np.maximum.accumulate) 

輸出...

myids mytime myvalues run_max_group 
0  123  0  27    27 
1  123  1  21    27 
2  123  2  24    27 
3  123  3  25    27 
4  123  4  22    27 
5  123  5  20    27 
6  123  6  20    27 
7  123  7  30    30 
8  123  8  24    30 
9  123  9  22    30 
10 456  0  29    29 
11 456  1  23    29 
12 456  2  30    30 
13 456  3  28    30 
14 456  4  26    30 
15 456  5  25    30 
16 456  6  28    30 
17 456  7  27    30 
18 456  8  20    30 
19 456  9  24    30 
+0

transform()記錄在任何地方嗎?此鏈接:http://pandas.pydata.org/pandas-docs/stable/generated/pandas.core.groupby.GroupBy.transform.html?highlight=transform#pandas.core.groupby.GroupBy.transform幾乎不顯示任何內容。其他鏈接:http://pandas.pydata.org/pandas-docs/stable/groupby.html?highlight=transform#transformation說了一些但不是很多 –

+1

我不熟悉文檔。我可以試着解釋它......如果你知道聚合函數是如何工作的,你就知道變換是如何工作的。它只是簡單地擴展聚合的結果值,以匹配組的大小。因此,讓我們說我有一個值爲[1,2,3]的組a,值爲[3,4,5]。如果我做groups.aggregate(max),我會得到a = 3和b = 5。 groups.transform會給我a = [3,3,3]和b = [5,5,5]。這使修改或添加到現有的DataFrame變得更容易。 –

1

看來,這的確不是太困難

byid = df.groupby('myid') 
rmax = byid['myvalues].cummax() 
for k, indices in byid.indices.items(): 
    print 'myid = %s' % k 
    print 'running max = %s' % rmax[indices] 

我有(幾乎)沒有以前的熊貓,但使用ipython作爲一項探索性工具,我能夠找到一個解決方案。我建議使用ipython來探索大型和複雜的庫。

p.s.重新我以前的評論:沒有需要axis=