提示:本站收集StackOverFlow近2千万问答,支持中英文搜索,鼠标放在语句上弹窗显示对应的参考中文或英文, 本站还提供 中文繁体 英文版本 中英对照 版本,有任何建议请联系yoyou2525@163.com。
我在第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
采用:
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
的Series.ne
:
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
获取组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
by |
对于按位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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.