pandas dataframe groupby并返回第n行,除非第n行不存在

时间:2016-08-18 16:09:48

标签: python pandas dataframe

我有一个像这样的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

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

2 个答案:

答案 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