Python数据帧,删除某个记录后的所有内容

时间:2017-10-16 11:58:06

标签: python pandas dataframe

我有一个像这样的数据框

import pandas as pd

df = pd.DataFrame({'id' : [1, 1, 1, 1, 2, 2, 2, 3, 3, 3], \
                   'counter' : [1, 2, 3, 4, 1, 2, 3, 1, 2, 3], \
                   'status':['a', 'b', 'b' ,'c', 'a', 'a', 'a', 'a', 'a', 'b'], \
                   'additional_data' : [12,35,13,523,6,12,6,1,46,236]}, \
                  columns=['id', 'counter', 'status', 'additional_data'])

df
Out[37]:  
    id  counter status  additional_data
0   1        1      a               12
1   1        2      b               35
2   1        3      b               13
3   1        4      c              523
4   2        1      a                6
5   2        2      a               12
6   2        3      a                6
7   3        1      a                1
8   3        2      a               46
9   3        3      b              236

id列表示哪些数据属于一起,counter表示行的顺序,status是特殊状态代码。我希望在第一次出现status='b'后删除所有行,并将第一行保留为status='b'

最终输出应该如下所示

   id  counter status  additional_data
0   1        1      a               12
1   1        2      b               35
4   2        1      a                6
5   2        2      a               12
6   2        3      a                6
7   3        1      a                1
8   3        2      a               46
9   3        3      b              236

一如既往,非常感谢所有帮助。

1 个答案:

答案 0 :(得分:1)

使用idxmax的自定义函数按条件返回值的索引,为未丢失的1行添加b

def f(x):
    m = x['status'].eq('b')
    b = m.idxmax()
    if m.any():
        x = x.loc[:b]
    else:
        x
    return x


a = df.groupby('id', group_keys=False).apply(f)
print (a)
   id  counter status  additional_data
0   1        1      a               12
1   1        2      b               35
4   2        1      a                6
5   2        2      a               12
6   2        3      a                6
7   3        1      a                1
8   3        2      a               46
9   3        3      b              236