为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

江户川乱折腾 2022-09-13 17:37:36
我已按数据集排序():DateIDdfDate          ID      Start_flag    End_flag                               01-01-2019    100     1             0     01-02-2019    100     0             001-03-2019    100     0             001-04-2019    100     0             001-05-2019    100     0             101-09-2019    100     1             0 01-10-2019    100     0             001-11-2019    100     0             001-12-2019    100     0             001-03-2019    500     1             0     01-04-2019    500     0             001-05-2019    500     0             001-06-2019    500     0             001-07-2019    500     0             001-08-2019    500     0             0 01-09-2019    700     1             001-10-2019    700     0             001-11-2019    700     0             1我想按最后一个实际值进行过滤,其中出现=1,之前所有与=1相同的数据都不应该被提取。dfDateStart_flagIDStart_flag换句话说,如果发生几次相同的情况,则仅保留最后一次最大 。Start_flag=1IDStart_flag=1Date预期视图为:dfDate          ID      Start_flag    End_flag                               01-09-2019    100     1             0 01-10-2019    100     0             001-11-2019    100     0             001-12-2019    100     0             001-03-2019    500     1             0     01-04-2019    500     0             001-05-2019    500     0             001-06-2019    500     0             001-07-2019    500     0             001-08-2019    500     0             0 01-09-2019    700     1             001-10-2019    700     0             001-11-2019    700     0             1 我试图通过 来做到这一点,但这不是正确的方法。.groupby(['ID','Start_flag'])['Date'].last()你能帮我如何过滤额外的数据吗?谢谢df
查看完整描述

2 回答

?
墨色风雨

TA贡献1853条经验 获得超6个赞

不是悸子


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  end

0  2019-01-09  100           1    0

1  2019-01-10  100           0    0

2  2019-01-11  100           0    0

3  2019-01-12  100           0    0

4  2019-01-03  500           1    0

5  2019-01-04  500           0    0

6  2019-01-05  500           0    0

7  2019-01-06  500           0    0

8  2019-01-07  500           0    0

9  2019-01-08  500           0    0

10 2019-01-09  700           1    0

11 2019-01-10  700           0    0

12 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))


查看完整回答
反对 回复 2022-09-13
?
精慕HU

TA贡献1845条经验 获得超8个赞

最终更正的解决方案是:


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)


查看完整回答
反对 回复 2022-09-13
  • 2 回答
  • 0 关注
  • 131 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号