【问题标题】:Python dataframe: Dropping rows subject to multiple conditionsPython数据框:根据多个条件删除行
【发布时间】:2017-10-19 10:20:45
【问题描述】:

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

   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]。对于列表中的每个元素,我想从数据框中删除 all 行,这些行在“a”列 “b”列中与第 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

有谁知道如何想出一个解决方案来快速做到这一点(用于更大的数据框)?谢谢。

【问题讨论】:

    标签: python pandas dataframe


    【解决方案1】:

    利用numpy broadcasting;

    • 使用loc 提取indicescolumns 处的值并将其重塑为3d 数组:

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

    • 将其与列 ab 进行比较,由于维度不匹配和 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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-10-14
      • 1970-01-01
      • 2020-03-06
      • 2018-06-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多