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怎么办?