【发布时间】:2020-07-06 22:38:12
【问题描述】:
我已按Date 和ID 数据集(df)排序:
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
我想通过最后一个实际的Date 过滤df,其中出现了Start_flag=1,不应该提取之前与Start_flag=1 相同的ID 的所有数据。
换句话说,如果同一ID 发生几次Start_flag=1,则只保留最后一个Start_flag=1,最大Date。
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 的额外数据吗?谢谢
编辑: 可能的解决方案是:
def filterTable(df):
result_list = []
for x in df['ID'].unique():
df_1 = df[df['ID']==x]
indx = df_1.where(((df_1['Start_flag']==0) & (df_1['Date']==df_1['Date'].min())) | (df_1['Start_flag'] == 1)).last_valid_index()
result_list.append(df_1.loc[indx:])
result= pd.concat(result_list)
return result
添加条件 df_1['Start_flag']==0 是因为在最初 Start_flag=0 直到 End_flag=1 的情况下返回 last_valid_index
此外,由于大型数据帧的执行时间,这不是最佳解决方案。尝试为它找到更好的解决方案。
【问题讨论】:
标签: python dataframe filter group-by apply