对于数据框中的每个组,请删除符合某些条件的行之后的行

时间:2019-01-07 01:14:17

标签: python pandas dataframe filter

在共享相同“名称”的行中,如何删除任何以负值为后的行?

例如,在下面的示例中,它希望滤除第2行和第3行,因为它们将第1行添加为负值。

输入:

    name        date   value
0    a    2019-01-06      1
1    a    2019-01-07     -1
2    a    2019-01-08      1
3    a    2019-01-09     -1
4    b    2019-01-06      1
5    b    2019-01-07      1
6    b    2019-01-08      1
7    b    2019-01-09      1

所需的输出

    name        date   value
0    a    2019-01-06      1
1    a    2019-01-07     -1
4    b    2019-01-06      1
5    b    2019-01-07      1
6    b    2019-01-08      1
7    b    2019-01-09      1

2 个答案:

答案 0 :(得分:0)

cumsum与bool结合使用,然后进行转移以包括第一行-1和第一行-1之后的所有行

s=df.value.eq(-1).groupby(df['name']).cumsum()
df[s.eq(0)|s.groupby(df.name).shift().eq(0)]
  name       date  value
0    a 2019-01-06      1
1    a 2019-01-07     -1
4    b 2019-01-06      1
5    b 2019-01-07      1
6    b 2019-01-08      1
7    b 2019-01-09      1

答案 1 :(得分:0)

不好看,但是如果您在groupby上使用'name'并找到要用作索引的第一个负值:

result = df.groupby('name').apply(
    lambda x: x.iloc[:np.where(x['value'] < 0)[0][0] + 1]
    if np.where(x['value'] < 0)[0].any() else x
)

输出:

       name        date  value
name x                        
a    0    a  2019-01-06      1
     1    a  2019-01-07     -1
b    4    b  2019-01-06      1
     5    b  2019-01-07      1
     6    b  2019-01-08      1
     7    b  2019-01-09      1

在没有负数的情况下,if语句存在。如果要删除多索引,只需用result.index = result.index.droplevel('name')删除它。