假设我有以下(示例)数据框:
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 行和第 3 行相同值的所有行, 4.
由于第 3 行具有 a=7 和 b=7,并且没有其他行具有 a=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
有谁知道如何提出一个解决方案来快速做到这一点(用于更大的数据框架)?谢谢。
最佳答案
利用numpy
broadcasting ;
使用
loc
提取索引和列处的值并将其 reshape 为 3d 数组:df.loc[indices,cols].values[:,None]
将其与列
a
进行比较和b
,由于维度不匹配和 numpy 广播,这会将第 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
关于Python数据帧: Dropping rows subject to multiple conditions,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46821785/