Python 熊猫-仅删除等于零的连续行

Python 熊猫-仅删除等于零的连续行,python,pandas,Python,Pandas,我有一个大的时间序列df(2.5 mil行),在给定的行中包含0个值,其中一些是合法的。但是,如果零值重复连续出现,我希望将其从df中删除 例如: A列包含[1,2,3,0,4,5,0,0,0,0,1,2,3,0,8,8,0,0,0,0,9]我想从中间删除[0,0,0,0]和[0,0,0,0,0],剩下的0来创建一个新的df[1,2,0,4,5,1,2,3,0,8,9] 删除前零值的长度是必须设置的参数-在本例中大于2 有没有一种聪明的方法可以在熊猫身上做到这一点呢?我们需要在这里建立一个新的参

我有一个大的时间序列df(2.5 mil行),在给定的行中包含0个值,其中一些是合法的。但是,如果零值重复连续出现,我希望将其从df中删除

例如: A列包含
[1,2,3,0,4,5,0,0,0,0,1,2,3,0,8,8,0,0,0,0,9]
我想从中间删除
[0,0,0,0]
[0,0,0,0,0]
,剩下的
0
来创建一个新的df
[1,2,0,4,5,1,2,3,0,8,9]

删除前零值的长度是必须设置的参数-在本例中大于2


有没有一种聪明的方法可以在熊猫身上做到这一点呢?

我们需要在这里建立一个新的参数,然后使用
删除重复项

df['New']=df.A.eq(0).astype(int).diff().ne(0).cumsum()
s=pd.concat([df.loc[df.A.ne(0),:],df.loc[df.A.eq(0),:].drop_duplicates(keep=False)]).sort_index()
s
Out[190]: 
    A  New
0   1    1
1   2    1
2   3    1
3   0    2
4   4    3
5   5    3
9   1    5
10  2    5
11  3    5
12  0    6
13  8    7
14  8    7
19  9    9
说明:

#df.A.eq(0) to find the value equal to 0 
#diff().ne(0).cumsum() if they are not equal to 0 then we would count them in same group .

如果该行为0,并且同一列中的上一行或下一行为0,则看起来您希望删除该行。您可以使用
shift
查找上一个和下一个值,并与当前值进行比较,如下所示:

result_df = df[~(((df.ColA.shift(-1) == 0) & (df.ColA == 0)) | ((df.ColA.shift(1) == 0) & (df.ColA == 0)))]
print(result_df)
结果:

    ColA
0      1
1      2
2      3
3      0
4      4
5      5
9      1
10     2
11     3
12     0
13     8
14     8
19     9
连续更新2次以上 以下是中的示例,添加新列以跟踪连续发生的事件,然后将其选中以进行筛选:

# https://stackoverflow.com/a/37934721/5916727
df['consecutive'] = df.ColA.groupby((df.ColA != df.ColA.shift()).cumsum()).transform('size')
df[~((df.consecutive>10) & (df.ColA==0))]

我应该更清楚-我可能想将此参数设置为10-100范围内的连续0值。如果采用您的解决方案,我不仅要检查上一个值和下一个值中的零,而且要检查上一个值和下一个值中的零。如果它们都匹配0,则删除所有。我可以用20个移位的表达式来表达,但可能有一种不那么冗长的方式?太好了<编码>快乐编码。