如何基于系列中的值从DataFrame中删除行

时间:2019-02-16 07:49:35

标签: python python-3.x pandas dataframe jupyter-notebook

我知道这是一个简单的问题,但我找不到解决的方法。

我有一个DataFrame,我想根据另一个series中的值删除行。

X
   1   2   5   6   7   10  12  13
0   5   4   4   4   0   4   0   3
1   3   0   3   0   0   0   0   3
2   4   0   0   0   0   0   0   0
3   3   0   0   0   5   4   5   5
4   3   0   0   0   0   0   0   1 

Vtk
1    4
2    3
4    3
Name: rank, dtype: int64

我想从 X 中删除与 Vtk 中值a = 3的索引相对应的行。在这种情况下,我期望基于值2删除索引为4a = 3 X 行。像这样:

X
   1   2   5   6   7   10  12  13
0   5   4   4   4   0   4   0   3
1   3   0   3   0   0   0   0   3
3   3   0   0   0   5   4   5   5

到目前为止,我已经尝试过:

b = Vtk.isin([~a])
newX = X.loc[b]

但是有一个IndexingError:

IndexingError: Unalignable boolean Series provided as indexer (index of the boolean Series and of the indexed object do not match

还有其他方法可以解决我的问题吗?

1 个答案:

答案 0 :(得分:2)

首先按Series过滤索引值,然后按DataFrame.drop删除行:

b = Vtk.index[Vtk == 3]
print (b)
Int64Index([2, 4], dtype='int64')

newX = X.drop(b)
print (newX)
   1  2  5  6  7  10  12  13
0  5  4  4  4  0   4   0   3
1  3  0  3  0  0   0   0   3
3  3  0  0  0  5   4   5   5

另一种使用isin~进行反掩码过滤的解决方案:

newX = X[~X.index.isin(b)]
print (newX)
   1  2  5  6  7  10  12  13
0  5  4  4  4  0   4   0   3
1  3  0  3  0  0   0   0   3
3  3  0  0  0  5   4   5   5

通过loc选择的解决方案是通过difference获取索引值:

newX = X.loc[X.index.difference(b)]
print (newX)
   1  2  5  6  7  10  12  13
0  5  4  4  4  0   4   0   3
1  3  0  3  0  0   0   0   3
3  3  0  0  0  5   4   5   5