假设我有以下(示例)数据帧:
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
有谁知道如何快速提出解决方案(用于更大的数据框)?谢谢。
答案 0 :(得分:1)
利用numpy
broadcasting;
使用loc
在 indices 和 columns 中提取值,并将其重新整形为3d数组:
df.loc[indices,cols].values[:,None]
将其与列a
和b
进行比较,这会将第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