删除包含特定值的pandas数据帧中的列和行
删除包含特定值的pandas数据帧中的列和行
这个问题已经有答案了:
我有一个类似这样的Pandas数据框(但实际上更大):
a b c d e f g h i j 0| 0 1 2 3 4 -500 -500 5 6 7 1| 2 3 4 5 6 -500 -500 6 5 4 2|-500 -500 -500 -500 -500 -500 -500 -500 -500 -500 3| 3 4 5 2 1 -500 -500 5 3 6
我想要删除所有包含 -500 (2) 的整行和整列(f和g)。我的数据框是自动生成的,我不知道哪些行和列已经包含了-500。
有人知道怎么做吗?
谢谢!
admin 更改状态以发布 2023年5月20日
这是一个NumPy方法,专门针对使用开放的 1D
数组进行跨维度选择的高效性能的实现,可以使用numpy.ix_
-
def delete_rows_cols(df): a = df.values mask = a!=-500 m0 = mask.any(0) m1 = mask.any(1) return pd.DataFrame(a[np.ix_(m1,m0)], df.index[m1], df.columns[m0])
样例运行 -
In [255]: df Out[255]: a b c d e f g h i j 0 0 1 2 3 4 -500 -500 5 6 7 1 2 3 4 5 6 -500 -500 6 5 4 2 -500 -500 -500 -500 -500 -500 -500 -500 -500 -500 3 3 4 5 2 1 -500 -500 5 3 6 In [256]: delete_rows_cols(df) Out[256]: a b c d e h i j 0 0 1 2 3 4 5 6 7 1 2 3 4 5 6 6 5 4 3 3 4 5 2 1 5 3 6
运行时间测试 -
# Setup input dataframe In [257]: arr = np.random.randint(0,100,(1000,1000)) In [258]: arr[:,np.random.choice(1000,100,replace=0)] = -500 In [259]: arr[np.random.choice(1000,100,replace=0)] = -500 In [260]: df = pd.DataFrame(arr) # @MaxU's pandas soln step-1 In [262]: mask = df.ne(-500) In [263]: %timeit df.ne(-500) 1000 loops, best of 3: 606 µs per loop # @MaxU's pandas soln step-2 In [264]: %timeit df.loc[mask.any(1), mask.any()] 10 loops, best of 3: 21.1 ms per loop In [261]: %timeit delete_rows_cols(df) 100 loops, best of 3: 3.75 ms per loop
In [76]: mask = df.eq(-500) In [77]: df.loc[~mask.all(1), ~mask.all()] Out[77]: a b c d e h i j 0 0 1 2 3 4 5 6 7 1 2 3 4 5 6 6 5 4 3 3 4 5 2 1 5 3 6
或者
In [83]: mask = df.ne(-500) In [85]: df = df.loc[mask.any(1), mask.any()] In [86]: df Out[86]: a b c d e h i j 0 0 1 2 3 4 5 6 7 1 2 3 4 5 6 6 5 4 3 3 4 5 2 1 5 3 6
这就是 mask
看起来的样子:
In [87]: mask Out[87]: a b c d e f g h i j 0 True True True True True False False True True True 1 True True True True True False False True True True 2 False False False False False False False False False False 3 True True True True True False False True True True