2014-09-18 59 views
2

我試圖使用熊貓基於表示時間(秒)的列中的差異來消除數據框中的一些近似重複。例如:熊貓根據差異列形成集羣

import pandas as pd, numpy as np 
df=pd.DataFrame([1200,1201,1233,1555,1650,5561,5562],columns=['Time']) 
df['Dif']=df.Time.diff() 
df['Coef']=np.random.rand(len(df)) 

enter image description here

所以我需要做的是檢查每一個有2秒內每次其他的區域內發生的時間值組中,選擇一個與Coef中的最高值,並丟棄休息。因此,在這個例子中,我會以某種方式將索引0和1組合在一起,並丟棄索引0(因爲df.Coef [0] < df.Coef 1)。

同樣,索引5,6和7將被分組到其他地方,並且所有索引都被丟棄。因此所需的輸出將是df.drop([0,5,7]):

enter image description here

我現在有一個蟒while循環的算法來做到這一點,但是該數據幀可包含數百萬indicies,因此它太慢了。任何純大熊貓的解決方案,將不勝感激

回答

4

你可以在這裏做一個GROUPBY,通過枚舉組:

In [11]: (df['Time'].diff() > 2).cumsum() 
Out[11]: 
0 0 
1 0 
2 1 
3 2 
4 3 
5 4 
6 4 
Name: Time, dtype: int64 

注:如果這是一個datetime列,而不是2你要比較一個timedelta。

In [12]: g = df.groupby((df.Time.diff() > 2).cumsum()) 

現在你可以對每個組使用idxmax(具有最大元素的索引),用於把係數列:

In [13]: g.Coef.idxmax() 
Out[13]: 
Time 
0  1 
1  2 
2  3 
3  4 
4  5 
Name: Coef, dtype: int64 

,並選擇這些行:

In [14]: df.loc[g.Coef.idxmax()]  # results will vary since we've used a random df 
Out[14]: 
    Time Dif  Coef 
1 1201  1 0.760751 
2 1233 32 0.501199 
3 1555 322 0.473628 
4 1650 95 0.371059 
5 5561 3911 0.917556 
+0

偉大的解決方案!我還沒有用過groupby,所以我很欣賞這個例子來幫助我學習它。 – derchambers 2014-09-18 23:37:30