Python pandas dataframe groupby并返回第n行,除非第n行没有';不存在

Python pandas dataframe groupby并返回第n行,除非第n行没有';不存在,python,pandas,dataframe,Python,Pandas,Dataframe,我有一个熊猫数据框,如下所示: 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

我有一个熊猫数据框,如下所示:

    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

任何帮助都将不胜感激!谢谢。

一种方法是使用
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

与unutbu的方法类似,您可以选择前两个(如果有一个,head(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

我喜欢这个解决方案,但是@Psidom,我有一个问题(4年后给出了答案):如果在
else
情况下,行应该包含NaN怎么办?