Python数据帧:根据多个条件删除行

时间:2017-10-19 01:57:15

标签: python pandas dataframe

假设我有以下(示例)数据帧:

   a  b  c  d  e
0  9  9  0  9  9
1  1  2  1  9  9
2  8  8  0  2  3
3  7  7  0  7  8
4  1  2  0  3  4
5  6  2  3  6  6
6  1  2  0  1  2
7  1  3  0  1  2

另外假设我已经生成了一个(任意的)索引列表,例如[3,4]。对于列表中的每个元素,我想从数据框中删除所有行,这些行在列' a'中具有相同的值。 栏' b'如第3行和第4行。

由于第3行的a = 7且b = 7,并且没有其他行具有= 7且b = 7,因此仅删除第3行。

由于第4行的a = 1且b = 2,第1行和第6行的a = 1且b = 2,因此我会删除第4,1和6行。

结果数据框看起来像这样:

   a  b  c  d  e
0  9  9  0  9  9
1  8  8  0  2  3
2  6  2  3  6  6
3  1  3  0  1  2

有谁知道如何快速提出解决方案(用于更大的数据框)?谢谢。

1 个答案:

答案 0 :(得分:1)

利用numpy broadcasting;

  • 使用loc indices columns 中提取值,并将其重新整形为3d数组:

    df.loc[indices,cols].values[:,None]

  • 将其与列ab进行比较,这会将第3行和第4行与所有其他行进行比较,原因是维度不匹配和广播广播

    df[cols].values == df.loc[indices,cols].values[:,None]

  • 使用.all(2)确保两列匹配,any(0)获取第3行或第4行的匹配

  • 取消~并删除匹配的行

给出:

indices = [3,4]
cols = ['a','b']
df[~(df[cols].values == df.loc[indices,cols].values[:,None]).all(2).any(0)]

#   a  b  c  d  e
#0  9  9  0  9  9
#2  8  8  0  2  3
#5  6  2  3  6  6
#7  1  3  0  1  2