在共享相同“名称”的行中,如何删除任何以负值为后的行?
例如,在下面的示例中,它希望滤除第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
答案 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')
删除它。