2017-01-16 75 views
1

如何從山坳通過分組a比較山坳b第一行和山坳b最後一行的值,不使用groupby功能?由於groupby函數對於大型數據集非常緩慢。大熊貓數據幀從各組比較第一和最後一行

a = [1,1,1,1,1,1,1,2,2,2,2,2,2,2,3,3,3,3,3,3,3] 
b = [1,0,0,0,0,0,7,8,0,0,0,0,0,4,1,0,0,0,0,0,1] 

返回兩個列表:一個具有從COL a其中最後值大於所述第一值時,等等

larger_or_equal = [1,3] 
smaller = [2] 
+0

我知道我有這個答案,如果我只是瞭解這個問題。你能否做更多的工作來解釋你在說什麼? – piRSquared

+0

你嘗試過'groupby(sort = False)'嗎?這可以加快大數據集的速度。 – IanS

+0

@piRSquared,組「1」和「3」被選中,因爲組中的最後一個元素大於或等於第一個。 – IanS

回答

4

所有numpy

a = np.array([1,1,1,1,1,1,1,2,2,2,2,2,2,2,3,3,3,3,3,3,3]) 
b = np.array([1,0,0,0,0,0,7,8,0,0,0,0,0,4,1,0,0,0,0,0,1]) 

w = np.where(a[1:] != a[:-1])[0] # find the edges 
e = np.append(w, len(a) - 1) # define the end pos 
s = np.append(0, w + 1) # define start pos 

# slice end pos with boolean array. then slice groups with end postions. 
# I could also have used start positions. 
a[e[b[e] >= b[s]]] 
a[e[b[e] < b[s]]] 

[1 3] 
[2] 
+0

我猜應該會更快! – IanS

+0

我還沒有測試過,但我假設這是'真' – piRSquared

3

在這裏,組名是不groupby的溶液。這樣做是爲了轉移列a檢測組更改:

df[df['a'].shift() != df['a']] 

    a b 
0 1 1 
7 2 8 
14 3 1 

df[df['a'].shift(-1) != df['a']] 

    a b 
6 1 7 
13 2 4 
20 3 1 

我們將在這兩個dataframes比較列b。我們只需要重置指數爲大熊貓比較工作:

first = df[df['a'].shift() != df['a']].reset_index(drop=True) 
last = df[df['a'].shift(-1) != df['a']].reset_index(drop=True) 
first.loc[last['b'] >= first['b'], 'a'].values 

array([1, 3]) 

然後做同樣的<得到其他羣體。或者做一個設定的差異。


正如我在評論中寫道,groupby(sort=False)很可能會更快取決於您的數據集。