Pandas - 仅删除等于零的连续行

时间:2018-04-09 04:08:00

标签: python pandas

我有一个大的时间序列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。

在熊猫中有一种聪明的方法吗?

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

连续2次以上更新

按照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 .