2016-08-18 7 views
3

存在しない場合を除きn行を返す:パンダデータフレームのGROUPBYとn行目は私はのようなパンダのデータフレームを有する

date  id   person      latitude longitude 
0 2016-07-11 1   rob       41.395279 2.162126 
1 2016-07-11 1   harry      51.485146 0.041339 
2 2016-07-11 1   susan      51.496457 0.051234 
3 2016-07-11 2   lenny      48.863281 2.339698 
4 2016-07-11 2   wendy      51.522469 -0.148812 
5 2016-07-11 3   john      51.490746 -0.022011 

私の第2の列を返す次いで、日付及びIDの両方によって、このデータフレームグループ化します他の3つの列のこのグループ。そのグループに行が1つしかない場合は、最初の行を返す(つまり、グループを削除しない)ようにします。

現在のところ、私は以下を持っていますが、これはそのグループのインスタンスが1つしかない場合があります。

df_grouped = df.groupby(['date', 'id']).nth(1).reset_index() 

私が目指しています出力は、次のとおりです。

date  id   person      latitude longitude 
0 2016-07-11 1   harry      51.485146 0.041339 
1 2016-07-11 2   wendy      51.522469 -0.148812 
2 2016-07-11 3   john      51.490746 -0.022011 

任意の助けいただければ幸いです!ありがとう。

答えて

3

一つの方法は、applyを使用し、各グループの行数に応じて行を拾うことです:

this questionにunutbuのアプローチと同様に
df.groupby(['date', 'id']).apply(lambda g: g.iloc[1,:] if g.shape[0] >= 2 else g.iloc[0,:]).reset_index(drop = True) 

#   date id person latitude longitude 
#0 2016-07-11 1 harry 51.485146 0.041339 
#1 2016-07-11 2 wendy 51.522469 -0.148812 
#2 2016-07-11 3 john 51.490746 -0.022011 
3

をお持ちの場合は、(最初​​の2を取ることができます、ヘッド(2)は1だけを返します)、最後の(2番目の)オカレンスを維持して重複を削除します:

df.groupby(['date', 'id']).head(2).drop_duplicates(['date', 'id'], keep='last') 
Out: 
     date id person latitude longitude 
1 2016-07-11 1 harry 51.485146 0.041339 
4 2016-07-11 2 wendy 51.522469 -0.148812 
5 2016-07-11 3 john 51.490746 -0.022011 
関連する問題