Python Pandas高级groupby和按日期筛选

Python Pandas高级groupby和按日期筛选,python,pandas,dataframe,data-manipulation,Python,Pandas,Dataframe,Data Manipulation,从输入创建输出数据帧,如何在每个id的target==1时第一次筛选行,或者在target为1的每个id中删除连续出现的字,但是在target=1之前将所有0保留在target中 输入 输出 ID date target a1 2019-11-01 0 a1 2019-12-01 0 a1 2020-01-01 1 a2 2019-11-01 0 a2 2019-12-01 1 ID date target 0 a

从输入创建输出数据帧,如何在每个id的target==1时第一次筛选行,或者在target为1的每个id中删除连续出现的字,但是在target=1之前将所有0保留在target中

输入

输出

ID   date         target
a1   2019-11-01   0
a1   2019-12-01   0
a1   2020-01-01   1
a2   2019-11-01   0
a2   2019-12-01   1
    ID  date    target
0   a1  2019-11-01  0
1   a1  2019-12-01  0
2   a1  2020-01-01  1
5   a2  2019-11-01  0
6   a2  2019-12-01  1

您只能保留groupby中目标总和为的行。您只能保留groupby中目标总和为
的行
从io导入stringIO
数据=字符串(“”)
uid、日期、目标
a1,2019-11-01,0
a1,2019-12-01,0
a1,2020-01-01,1
a1,2020-02-01,1
a1,2020-03-01,0
a2,2019-11-01,0
a2,2019-12-01,1
a2,2020-03-01,0
a2,2020-04-01,1
"""
)
df=pd.read\u csv(data).rename(columns=lambda x:x.strip())
def filter_在_组中(df:pd.DataFrame):
ind=np.argmax(df.target)
返回df.loc[:,['date','target']].iloc[:ind+1]
df_已过滤=(
df
.groupby('uid')
.apply(λx:过滤器在组(x)中)
.reset_index()
.drop('标高1',轴=1)
)

从io导入stringIO
数据=字符串(“”)
uid、日期、目标
a1,2019-11-01,0
a1,2019-12-01,0
a1,2020-01-01,1
a1,2020-02-01,1
a1,2020-03-01,0
a2,2019-11-01,0
a2,2019-12-01,1
a2,2020-03-01,0
a2,2020-04-01,1
"""
)
df=pd.read\u csv(data).rename(columns=lambda x:x.strip())
def filter_在_组中(df:pd.DataFrame):
ind=np.argmax(df.target)
返回df.loc[:,['date','target']].iloc[:ind+1]
df_已过滤=(
df
.groupby('uid')
.apply(λx:过滤器在组(x)中)
.reset_index()
.drop('标高1',轴=1)
)

groupby ID,cumsum target,test the results groupby ID,cumsum target,test the results发布有效答案后再提问通常是不受欢迎的,尤其是当你没有尝试解决问题时。更好的方法是接受这一正确答案,然后用修改后的数据发布一个新问题。在发布有效答案后编辑问题通常是不受欢迎的,尤其是当你没有表现出试图解决问题的努力时。更好的方法是接受这一正确答案,然后用修改后的数据发布一个新问题[
import pandas as pd
df = pd.DataFrame({'ID': ['a1', 'a1', 'a1', 'a1', 'a1', 'a2', 'a2', 'a2', 'a2'],
 'date': ['2019-11-01',
  '2019-12-01',
  '2020-01-01',
  '2020-02-01',
  '2020-03-01',
  '2019-11-01',
  '2019-12-01',
  '2020-03-01',
  '2020-04-01'],
 'target': [0, 0, 1, 1, 0, 0, 1, 0, 1]})


df = df.loc[df.groupby('ID')['target'].cumsum()<=1]
df = df.loc[df.groupby('ID')['target'].shift(1).ne(1)]
    ID  date    target
0   a1  2019-11-01  0
1   a1  2019-12-01  0
2   a1  2020-01-01  1
5   a2  2019-11-01  0
6   a2  2019-12-01  1