Python 熊猫:过滤或分组,然后变换以选择最后一行
这篇文章引用了SO中的一篇文章 只是重申一下,我有一个数据帧df作为 我们有两种方法来解决这个问题 首先是过滤方法: 第二种是groupby.transform方法: 但我想按日期列过滤,而不是按持续时间过滤。我通过以下代码获得正确的结果: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=
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