Python 熊猫:过滤或分组,然后变换以选择最后一行

Python 熊猫:过滤或分组,然后变换以选择最后一行,python,pandas,Python,Pandas,这篇文章引用了SO中的一篇文章 只是重申一下,我有一个数据帧df作为 我们有两种方法来解决这个问题 首先是过滤方法: 第二种是groupby.transform方法: 但我想按日期列过滤,而不是按持续时间过滤。我通过以下代码获得正确的结果: df_interim = df.loc[(df['Date']=='2019-03-01')&(df['Duration'] >=90)] df_final = df.merge(df_interim[['Group','Date']],on=

这篇文章引用了SO中的一篇文章

只是重申一下,我有一个数据帧df作为

我们有两种方法来解决这个问题

首先是过滤方法:

第二种是groupby.transform方法:

但我想按日期列过滤,而不是按持续时间过滤。我通过以下代码获得正确的结果:

df_interim = df.loc[(df['Date']=='2019-03-01')&(df['Duration'] >=90)]
df_final = df.merge(df_interim[['Group','Date']],on='Group',how='right').reset_index()
在上面的代码中,我硬编码了日期

我的问题是:如何动态选择数据帧中的最后一个日期?然后对组执行筛选或groupby.transform


有线索吗

我们也可以使用transform选择最后一个日期


我认为您需要首先筛选“按日期排序的最大索引”,然后为所有列选择“按行排序”:

df['Date'] = pd.to_datetime(df['Date'])

df1 = df.loc[df.groupby('Group')['Date'].idxmax()]
print (df1)
        Date Group  Value  Duration
2 2018-03-01     A     25        88
5 2018-03-01     B     25       238
然后仅按持续时间筛选具有最大日期的行:

最后一次过滤原始组列时,使用:

这给了我零长度
df.groupby('Group').filter(lambda x: x.Duration.max()>=90) 
df = df[df.groupby('Group')['Duration'].transform('last') >= 90] 
df_interim = df.loc[(df['Date']=='2019-03-01')&(df['Duration'] >=90)]
df_final = df.merge(df_interim[['Group','Date']],on='Group',how='right').reset_index()
lastd=df.groupby('Date')['Duration'].transform('max') 
df_interim = df.loc[(df['Date']==lastd)&(df['Duration'] >=90)]
df['Date'] = pd.to_datetime(df['Date'])

df1 = df.loc[df.groupby('Group')['Date'].idxmax()]
print (df1)
        Date Group  Value  Duration
2 2018-03-01     A     25        88
5 2018-03-01     B     25       238
g = df1.loc[df1['Duration'] >= 90, 'Group']
print (g)
        Date Group  Value  Duration
3 2018-01-01     B     15       180
4 2018-02-01     B     30       210
5 2018-03-01     B     25       238
df = df[df['Group'].isin(g)]
print (df)
        Date Group  Value  Duration
3 2018-01-01     B     15       180
4 2018-02-01     B     30       210
5 2018-03-01     B     25       238