Python:过滤数据仅按活动标记和日期保留最后数据

我已按数据集排序():DateIDdf


Date          ID      Start_flag    End_flag                               

01-01-2019    100     1             0     

01-02-2019    100     0             0

01-03-2019    100     0             0

01-04-2019    100     0             0

01-05-2019    100     0             1

01-09-2019    100     1             0 

01-10-2019    100     0             0

01-11-2019    100     0             0

01-12-2019    100     0             0

01-03-2019    500     1             0     

01-04-2019    500     0             0

01-05-2019    500     0             0

01-06-2019    500     0             0

01-07-2019    500     0             0

01-08-2019    500     0             0 

01-09-2019    700     1             0

01-10-2019    700     0             0

01-11-2019    700     0             1

我想按最后一个实际值进行过滤,其中出现=1,之前所有与=1相同的数据都不应该被提取。dfDateStart_flagIDStart_flag


换句话说,如果发生几次相同的情况,则仅保留最后一次最大 。Start_flag=1IDStart_flag=1Date


预期视图为:df


Date          ID      Start_flag    End_flag                               

01-09-2019    100     1             0 

01-10-2019    100     0             0

01-11-2019    100     0             0

01-12-2019    100     0             0

01-03-2019    500     1             0     

01-04-2019    500     0             0

01-05-2019    500     0             0

01-06-2019    500     0             0

01-07-2019    500     0             0

01-08-2019    500     0             0 

01-09-2019    700     1             0

01-10-2019    700     0             0

01-11-2019    700     0             1 

我试图通过 来做到这一点,但这不是正确的方法。.groupby(['ID','Start_flag'])['Date'].last()


你能帮我如何过滤额外的数据吗?谢谢df

江户川乱折腾
浏览 132回答 2
2回答

墨色风雨

不是悸子result = []for i in df['ID'].unique():    adf = df[df['ID'] == i].sort_values(by="Date").reset_index(drop=True)    i = adf.where(adf['Start_flag'] == 1).last_valid_index()    result.append(adf.iloc[range(i, len(adf))])   print (pd.concat(result).reset_index(drop=True))输出:         Date   ID  Start_flag  end0  2019-01-09  100           1    01  2019-01-10  100           0    02  2019-01-11  100           0    03  2019-01-12  100           0    04  2019-01-03  500           1    05  2019-01-04  500           0    06  2019-01-05  500           0    07  2019-01-06  500           0    08  2019-01-07  500           0    09  2019-01-08  500           0    010 2019-01-09  700           1    011 2019-01-10  700           0    012 2019-01-11  700           0    1注意:我们可以通过将逻辑移动到函数并通过 调用函数来避免循环。但是,在拳头组上运行函数两次,因此我们必须确保我们的函数没有副作用。applygroupbygroupby使用分组:def fun(adf):    adf = adf.sort_values(by="Date").reset_index(drop=True)    i = adf.where(adf['Start_flag'] == 1).last_valid_index()    return adf.iloc[range(i, len(adf))]print (df.groupby('ID').apply(fun).reset_index(drop=True))

精慕HU

最终更正的解决方案是:def validateData(adf):      adf = adf.sort_values(by="Date").reset_index(drop=True)    indx = adf.where(((adf['Start_flag']==0) & (adf['Date']==adf['Date'].min())) | (adf['Start_flag'] == 1)).last_valid_index()    return adf.iloc[range(indx, len(adf))]def filterData(df):    start_time = datetime.now()    print('Start_time=', start_time)    RESULT_DF = df.groupby('ID').apply(lambda x: validateData(x))    print("--- %s seconds ---" % (datetime.now() - start_time))    return RESULT_DF要应用于数据:RESULT_DF = filterData(df)
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python