我有一个大的时间序列df(2.5mil行),在给定的行中包含0个值,其中一些是合法的。但是,如果重复连续出现零值,我想将它们从我的df中删除。
实施例:
作品A包含[1,2,3,0,4,5,0,0,0,1,2,3,0,8,8,0,0,0,0,9]
我想从中间删除[0,0,0]
和[0,0,0,0]
,并留下余下的0
来制作新的[1,2,3,0,4,5,1,2,3,0,8,8,9]
。< / p>
删除前的零值长度是必须设置的参数 - 在这种情况下&gt; 2。
在熊猫中有一种聪明的方法吗?
答案 0 :(得分:1)
如果它是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
按照link中的示例,添加新列以跟踪连续发生并稍后检查以过滤:
# 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))]
答案 1 :(得分:0)
我们需要在这里建立一个新的参数,然后使用drop_duplicates
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 .