2017-12-29 12 views
2

すでにグループ化されたインデックスリストをdataframeとし、サブデータフレームをgroupbyまたは他の関数を使用して取得したいとします。私はisinのような[df[df.index.isin(group)] for group in grouplist]を使用してデータフレームを何回も照会することができますが、それは非常に遅いようです。どのようにグループをより効率的にすることができますか?pandasグループをグループインディスのリストで

grouplist = [[1],[29, 30, 31],[40],[46, 47, 48, 49],[58, 59],[68, 69, 70],[99, 100, 101],[103]] 

答えて

2

あなたがlocを必要とするようだ:

[df.loc[group] for group in grouplist] 

EDIT:列のチェック値について

が速く使用である:

[df[np.in1d(df.A, group)] for group in grouplist] 

または:

[df[df.A.isin(group)] for group in grouplist] 

タイミング

np.random.seed(123) 
N = 100000 

df = pd.DataFrame({'A': np.random.randint(150, size=N), 
        'B':np.random.rand(N)}) 
#print (df) 


grouplist = [[1],[29, 30, 31],[40],[46, 47, 48, 49], 
      [58, 59],[68, 69, 70],[99, 100, 101],[103]] 

def a(df): 
    df = df.set_index('A') 
    return [df.loc[group] for group in grouplist] 

def b(df): 
    return [df[df.A.isin(group)] for group in grouplist] 

def c(df): 
    return [df[np.in1d(df.A, group)] for group in grouplist] 


In [84]: %timeit (a(df)) 
10 loops, best of 3: 117 ms per loop 

In [85]: %timeit (b(df)) 
100 loops, best of 3: 18.3 ms per loop 

In [86]: %timeit (c(df)) 
100 loops, best of 3: 5.44 ms per loop 

警告

パフォーマンスは本当にデータに依存 - データフレームの大きさとgrouplistでグループ内の値の数を。

+0

ありがとうございますが、インデックスではなくカラムの値があればどうなりますか? – natsuapo

+0

次に、最も速いのは、最初に 'df = df.set_index( 'col')'でインデックスを設定し、 'loc'を使用します。 – jezrael

+0

残念ですが、 'df.set_index( 'col')'と 'loc' 'isin'を使うよりも速くはありません。サンプルデータが小さいためかもしれません。 – natsuapo

関連する問題