2016-12-06 4 views
3

私は、約30の列で構成された1,000万を超える生データを持つデータフレームを持っています。pandasデータフレームのデータセットをサブセット化する方法は?

最初の列は、私は、各IDの最初の4行を抽出したいID

ID C 
1 1 
1 2 
1 3 
1 2 
1 3 
2 1 
2 5 
2 9 
2 0 
2 1 

(それはすでにソートされているとして、彼らは、最新の入力です)

である私は現在使用しています残念ながら、残念ながらデータの約5%を処理するのに約2時間かかり、データ全体を処理するには1日程度かかります。

df1 = pd.DataFrame() # an empty dataframe 
for i in df.ID: # df is the dataframe which contains the data 
    df2 = df[df["ID"]== i] 
    df2 = df2[0:4] # take the first four rows 
    df_f = df1.append(df2) 

短時間で同じことをする効果的な方法がありますか?

df.groupby("ID").head(4) 

enter image description here

ここgroupby().head()法に対する実行時間のテストを使用して元のコードの改訂版である:あなたがhead()方法が必要

+0

はそれがそこに保証されています各IDのインスタンスが少なくとも4つありますか? – kiliantics

+0

はいほとんどのIDには10以上のインスタンスがあり、過去4か月間のインスタンスのみを取得したいので、インスタンスは各IDの降順でソートされています。 –

答えて

2

def loop(): 
    df1 = pd.DataFrame() # an empty dataframe 
    for i in df.ID.drop_duplicates(): # df is the dataframe which contains the data 
     df2 = df[df["ID"]== i] 
     df2 = df2[0:4] # take the first four rows 
     df1 = pd.concat([df1, df2]) 
    return df1 

%timeit loop() 
# 100 loops, best of 3: 1.99 ms per loop 

%timeit df.groupby("ID").head(4) 
# 1000 loops, best of 3: 485 µs per loop 
+1

あなたのコードを使用しました: df.groupby( "ID")。head(4) ループを使用せずに問題を解決します。 ありがとうございます。 –

関連する問題