我有一个像这样的pandas数据框:
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
我想按日期和ID对此数据框进行分组,然后返回该组的第二行以用于其他三列。如果该组只有一行,那么我希望它返回第一行(即不丢弃该组)。
目前我有以下内容,但这只是在该组中只有一个实例的场合。
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
任何帮助将不胜感激!感谢。
答案 0 :(得分:3)
一种方法是使用apply
并根据每个组的行数选择行:
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
答案 1 :(得分:3)
与unutbu对this question的方法类似,你可以取前两个(如果你有一个,head(2)只返回1)并删除重复项,保持最后一次(第二次):
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