此帖子引用了SO中的my post之一。
只需重申一下,我有一个数据框df
为
Date Group Value Duration
2018-01-01 A 20 30
2018-02-01 A 10 60
2018-03-01 A 25 88 <-----Last row for Group A
2018-01-01 B 15 180
2018-02-01 B 30 210
2018-03-01 B 25 238 <-----Last row of Group B
考虑到每个组的最后一行,如果Duration值小于90,我们将忽略该组。因此,我得到的数据帧df_final
应该看起来像
Date Group Value Duration
2018-01-01 B 15 180
2018-02-01 B 30 210
2018-03-01 B 25 240
有两种方法可以解决此问题。
首先是filter
方法:
df.groupby('Group').filter(lambda x: x.Duration.max()>=90)
第二个是groupby.transform
方法:
df = df[df.groupby('Group')['Duration'].transform('last') >= 90]
但是我想通过Date
列而不是Duration
进行过滤。我通过以下代码得到正确的结果:
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()
在上面的代码中,我已经对Date
进行了硬编码。
我的问题是:如何动态选择数据框中的最后日期?然后在filter
上执行groupby.transform
或Group
?
有任何线索吗?
答案 0 :(得分:1)
我们也可以使用transform
来选择最后一个日期
lastd=df.groupby('Date')['Duration'].transform('max')
df_interim = df.loc[(df['Date']==lastd)&(df['Duration'] >=90)]
答案 1 :(得分:0)
我认为您首先需要按import React from 'react'
import Cards from './cards'
function Main() {
const user = false
const [greeting, setGreeting] = React.useState(user ? "Welcome" : "You dont belong here")
return (
<main role="main" className="col-md-9 ml-sm-auto col-lg-10 px-md-4">
<div className="d-flex flex-wrap flex-md-nowrap pt-2 mt-2 mb-4">
<h1> {greeting} Random Dude!</h1>
</div>
<Cards />
</main>
)
}
export default Main
和DataFrameGroupBy.idxmax
筛选最大索引,然后按DataFrame.loc
为所有列选择行:
Date
然后按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
过滤,只过滤最大Duration
行:
Date
最后用Series.isin
用boolean indexing
过滤原始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
列:
Group