Python 熊猫按组删除前导零值
我想在value列中删除带零的行,直到每个组的第一个非零值的索引 输入 输出 与类似,但在索引和分组之前会将数据上移。使用groupby和cumsum,将结果与零进行比较:Python 熊猫按组删除前导零值,python,pandas,Python,Pandas,我想在value列中删除带零的行,直到每个组的第一个非零值的索引 输入 输出 与类似,但在索引和分组之前会将数据上移。使用groupby和cumsum,将结果与零进行比较: df[df.groupby('group')['value'].cumsum().gt(0)] date value group 1 2019-01-02 50 A 2 2019-01-03 100 A 3 2019-01-04 120 A 5
df[df.groupby('group')['value'].cumsum().gt(0)]
date value group
1 2019-01-02 50 A
2 2019-01-03 100 A
3 2019-01-04 120 A
5 2019-01-02 10 B
6 2019-01-03 0 B
7 2019-01-04 20 B
10 2019-01-03 10 C
11 2019-01-04 0 C
这是一个更通用的版本,用于删除具有任何前导值的行
thresh = 0
df[df['value'].ne(thresh).groupby(df['group']).cumsum().gt(0)]
date value group
1 2019-01-02 50 A
2 2019-01-03 100 A
3 2019-01-04 120 A
5 2019-01-02 10 B
6 2019-01-03 0 B
7 2019-01-04 20 B
10 2019-01-03 10 C
11 2019-01-04 0 C
使用groupby和cumsum,将结果与零进行比较:
df[df.groupby('group')['value'].cumsum().gt(0)]
date value group
1 2019-01-02 50 A
2 2019-01-03 100 A
3 2019-01-04 120 A
5 2019-01-02 10 B
6 2019-01-03 0 B
7 2019-01-04 20 B
10 2019-01-03 10 C
11 2019-01-04 0 C
这是一个更通用的版本,用于删除具有任何前导值的行
thresh = 0
df[df['value'].ne(thresh).groupby(df['group']).cumsum().gt(0)]
date value group
1 2019-01-02 50 A
2 2019-01-03 100 A
3 2019-01-04 120 A
5 2019-01-02 10 B
6 2019-01-03 0 B
7 2019-01-04 20 B
10 2019-01-03 10 C
11 2019-01-04 0 C
好的方法,如果序列包含负值,可能不起作用。@QuangHoang是的,OP可能想澄清在这种情况下的预期行为,如果要删除它们,那么解决方法很简单。如果要保留它们,那么会有点困难,但可行。评论实际上是针对您的第一个解决方案。第二个解决方案会很好。@cs95谢谢您的解决方案!理想情况下,我希望删除具有任意阈值的前导行,例如,第一个值高于20,或者第一个值低于20-10@NickD我的第二个解决方案会奏效。请看一看我编辑的内容,以确保清晰。如果序列包含负值,好的方法可能不起作用。@QuangHoang对,OP可能希望澄清在这种情况下的预期行为。如果要删除它们,那么解决方法很简单。如果要保留它们,那么会有点困难,但可行。评论实际上是针对您的第一个解决方案。第二个解决方案会很好。@cs95谢谢您的解决方案!理想情况下,我希望删除具有任意阈值的前导行,例如,第一个值高于20,或者第一个值低于20-10@NickD我的第二个解决方案会奏效。为了清晰起见,请看一看我编辑的。
thresh = 0
df[df['value'].ne(thresh).groupby(df['group']).cumsum().gt(0)]
date value group
1 2019-01-02 50 A
2 2019-01-03 100 A
3 2019-01-04 120 A
5 2019-01-02 10 B
6 2019-01-03 0 B
7 2019-01-04 20 B
10 2019-01-03 10 C
11 2019-01-04 0 C