嗨,我的数据框看起来像这样
A B Timestamp
1 some text 8/13/2018
1 some text 12/13/2018
2 some text 7/13/2018
1 some text 9/13/2018
2 other text Boom 12/13/2018
1 some text Boom 11/13/2018
我必须对A上的数据帧进行分组,并使用时间戳对每个组进行排序。现在,我想以一种方式过滤每个组,使结果数据框在发生“爆炸”之前具有值。 我希望我的结果数据框像这样。
A B Timestamp
1 some text 8/13/2018
1 some text 9/13/2018
2 some text 7/13/2018
我尝试了
temp1=df.groupby('A').apply(lambda x: x.sort_values(["Timestamp"], ascending
= True)).reset_index(drop=True)
temp1.groupby('A').apply(lambda
x:x.loc[:x[x['B'].str.contains("Boom")].index[0]])
IndexError:索引0超出了大小为0的轴0的范围 有什么帮助吗? 谢谢
简而言之:我想删除每个类别在“繁荣”之后发生的所有记录。
答案 0 :(得分:1)
IIUC,
df.groupby('A').apply(lambda s: s[s.Timestamp < s[s.B.str.contains('Boom')].Timestamp.max()].sort_values('Timestamp', ascending=True))
A B Timestamp
A
1 0 1 some text 2018-08-13
3 1 some text 2018-09-13
2 2 2 some text 2018-07-13
答案 1 :(得分:0)
我对此并不满意,但这是一个解决方案
A = [1,1,2,1,2,1]
B= 'text text text text boom boom'.split()
T = pd.to_datetime(['2018-08-13','2018-12-13','2018-07-13','2018-09-13','2018-12-13','2018-11-13'])
df = pd.DataFrame({'A':A, 'B':B, 'Timestamp':T})
#Here is the solution
frames = []
for name, frame in df.sort_values(['A','Timestamp']).groupby('A'):
ix = frame.B=='boom'
frames.append(frame.loc[:ix.argmax(),:])
before_boom = pd.concat(frames).query('B != "boom"')
输出:
A B Timestamp
1 text 2018-08-13
1 text 2018-09-13
2 text 2018-07-13
编辑:
我喜欢这样
to_join = df[df.B=='boom'].groupby(['A','B']).Timestamp.min().reset_index()
new_df=df.merge(to_join, on = 'A', suffixes=['','_y'])
new_df.loc[new_df.Timestamp<new_df.Timestamp_y,['A','B','Timestamp']]