为特定条件下的每个组提供一个排序的数据帧子集

时间:2018-08-13 17:30:04

标签: python pandas pandas-groupby

嗨,我的数据框看起来像这样

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的范围 有什么帮助吗? 谢谢

简而言之:我想删除每个类别在“繁荣”之后发生的所有记录。

2 个答案:

答案 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']]