删除熊猫数据框中包含特定值的列和行[重复]
Posted
技术标签:
【中文标题】删除熊猫数据框中包含特定值的列和行[重复]【英文标题】:Delete columns and rows containing specific values in pandas dataframe [duplicate] 【发布时间】:2017-09-27 11:32:58 【问题描述】:我有一个看起来像这样的熊猫数据框(但实际上要大得多):
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。
有人知道怎么做吗?
谢谢!
【问题讨论】:
Deleting DataFrame row in Pandas based on column value的可能重复 【参考方案1】: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
【讨论】:
【参考方案2】:这是一种 NumPy 方法,专门用于通过 open 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
【讨论】:
以上是关于删除熊猫数据框中包含特定值的列和行[重复]的主要内容,如果未能解决你的问题,请参考以下文章