熊猫:过滤器或分组依据,然后转换以选择最后一行

时间:2020-05-23 16:28:39

标签: python pandas

此帖子引用了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.transformGroup

有任何线索吗?

2 个答案:

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