Python数据帧: Dropping rows subject to multiple conditions

标签 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 行和第 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/

相关文章:

python - 将数据帧值拆分为指定数量的组并应用函数 - pandas

python - 在 pandas GroupBy 输出中将缺少的组键作为 NaN 包括在内

python - 两个 Pandas 数据框中的共同列列表

python - 按月份和日期Python比较两个日期

python - Pandas 组内的交替值

python - 使用(对于每个单元格)其他数据帧的平均值创建数据帧

python - 如何提高数据框中的搜索索引

python - 从模型中获取 JSONAPI 模式

python - pandas 选择数据框中有条件的特定列与另一个条件导致串联

python - 尝试按对象将行附加到组中的每个组时出现奇怪的行为