我有一个像这样的数据帧,在第1列中有连续的零:
col1 col2 col3
1 2 3
0 4 5
0 1 4
2 7 8
0 1 2
4 4 4
0 1 3
0 4 2
0 1 9
4 6 2
我想跳过连续两次为零的行至少2次。
例如,输出将如下所示:
col1 col2 col3
1 2 3
2 7 8
0 1 2
4 4 4
4 6 2
答案 0 :(得分:0)
使用:
m = df['col1'].ne(0)
s = m.cumsum() * (~m)
df = df[s.groupby(s).transform('size').lt(2) | m]
或者:
df = df[s.map(s.value_counts()).lt(2) | m]
print (df)
col1 col2 col3
0 1 2 3
3 2 7 8
4 0 1 2
5 4 4 4
9 4 6 2
说明:
首先比较不等于Series.ne
的0
:
print (df['col1'].ne(0))
0 True
1 False
2 False
3 True
4 False
5 True
6 False
7 False
8 False
9 True
Name: col1, dtype: bool
然后将cumsum
用于组-具有0
的值具有相同的组:
print (m.cumsum())
0 1
1 1
2 1
3 2
4 2
5 3
6 3
7 3
8 3
9 4
Name: col1, dtype: int32
乘以反向布尔掩码可去除非0
值:
print (m.cumsum() * (~m))
0 0
1 1
2 1
3 0
4 2
5 0
6 3
7 3
8 3
9 0
Name: col1, dtype: int32
然后按GroupBy.transform
获取组数:
print (s.groupby(s).transform('size'))
0 4
1 2
2 2
3 4
4 1
5 4
6 3
7 3
8 3
9 4
Name: col1, dtype: int64
并按lt
<
进行比较:
print (s.groupby(s).transform('size').lt(2))
0 False
1 False
2 False
3 False
4 True
5 False
6 False
7 False
8 False
9 False
Name: col1, dtype: bool
由原始掩码m
到|
的按位OR
的最后一条链:
print (s.groupby(s).transform('size').lt(2) | m)
0 True
1 False
2 False
3 True
4 True
5 True
6 False
7 False
8 False
9 True
Name: col1, dtype: bool
最后用boolean indexing
进行过滤:
print (df[s.groupby(s).transform('size').lt(2) | m])
col1 col2 col3
0 1 2 3
3 2 7 8
4 0 1 2
5 4 4 4
9 4 6 2