我将扩展@User 的通用解决方案以提供drop 免费替代方案。这是针对根据问题标题(不是 OP 的问题)在此处指导的人
假设您要删除所有具有负值的行。一种衬垫解决方案是:-
df = df[(df > 0).all(axis=1)]
分步说明:--
让我们生成一个 5x5 随机正态分布数据框
np.random.seed(0)
df = pd.DataFrame(np.random.randn(5,5), columns=list('ABCDE'))
A B C D E
0 1.764052 0.400157 0.978738 2.240893 1.867558
1 -0.977278 0.950088 -0.151357 -0.103219 0.410599
2 0.144044 1.454274 0.761038 0.121675 0.443863
3 0.333674 1.494079 -0.205158 0.313068 -0.854096
4 -2.552990 0.653619 0.864436 -0.742165 2.269755
让条件是删除否定。满足条件的布尔 df:-
df > 0
A B C D E
0 True True True True True
1 False True False False True
2 True True True True True
3 True True False True False
4 False True True False True
满足条件的所有行的布尔序列请注意,如果行中的任何元素不符合条件,则该行被标记为 false
(df > 0).all(axis=1)
0 True
1 False
2 True
3 False
4 False
dtype: bool
最后根据条件从数据框中过滤掉行
df[(df > 0).all(axis=1)]
A B C D E
0 1.764052 0.400157 0.978738 2.240893 1.867558
2 0.144044 1.454274 0.761038 0.121675 0.443863
您可以将其分配回 df 以实际 delete 与 filter 在上面完成
df = df[(df > 0).all(axis=1)]
这可以很容易地扩展为过滤掉包含 NaN s(非数字条目)的行:-
df = df[(~df.isnull()).all(axis=1)]
这也可以简化为以下情况:删除 E 列为负数的所有行
df = df[(df.E>0)]
我想以一些分析统计信息作为结尾,说明为什么 @User 的 drop 解决方案比基于原始列的过滤慢:-
%timeit df_new = df[(df.E>0)]
345 µs ± 10.5 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
%timeit dft.drop(dft[dft.E < 0].index, inplace=True)
890 µs ± 94.9 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
一列基本上是一个Series 即NumPy 数组,它可以被索引而不需要任何成本。对于那些对底层内存组织如何影响执行速度感兴趣的人来说,这里是一个很棒的Link on Speeding up Pandas: