2017-01-16 14 views
1

groupby機能を使用せずに、列bの最初の行の値と列bの最後の行を列aでグループ化して比較する方法を教えてください。 groupby関数は大規模なデータセットでは非常に遅いためです。pandas dataframe各グループの最初と最後の行を比較します

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] 

戻り二つのリスト:1は、ここに

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

など、最後の値が第1の値よりも大きくなっているCOL aからグループ名を持つ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 

私たちは、これら二つのデータフレームの列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)はよくあなたのデータセットに応じて、より高速であるかもしれません。

関連する問題