Python 熊猫-仅删除等于零的连续行
我有一个大的时间序列df(2.5 mil行),在给定的行中包含0个值,其中一些是合法的。但是,如果零值重复连续出现,我希望将其从df中删除 例如: A列包含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 有没有一种聪明的方法可以在熊猫身上做到这一点呢?我们需要在这里建立一个新的参
[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个移位的表达式来表达,但可能有一种不那么冗长的方式?太好了<编码>快乐编码。