【问题标题】:Pandas dataframe - select elements based on list of values for multiple columnsPandas 数据框 - 根据多列的值列表选择元素
【发布时间】:2021-11-10 12:13:12
【问题描述】:

我有一个如下所示的数据框:

df = pd.DataFrame({
    'C1': ['A','A','A','B', 'B', 'C', 'C'],
    'C2': [1, 2, 3, 1, 2, 1, 2],
    'C3': [2., 3.1, 1.2, 1.4, 2.1, .4, .5]
})

我想为 C1 和 C2 上的单个组合过滤数据框。

例如,我想要以下匹配项的组合: (C1 == 'A' & C2 == 2)和 (C1 == 'B' & C2 == 1)。

生成的数据框应如下所示:

   C1   C2  C3
0   A   2   3.1
1   B   1   1.4

所以,我想过滤独特的组合,例如由元组列表给出。对于上面的示例,它看起来像这样:

[('A', 2), ('B', 1)]

您能指导我如何在不使用循环的情况下理想地完成此任务吗?

谢谢。

菲利普

【问题讨论】:

    标签: python pandas filter


    【解决方案1】:

    让我们尝试MultiIndex.isin 创建一个可用于过滤行的布尔掩码

    df[df.set_index(['C1', 'C2']).index.isin(l)]
    

    merge 的替代方法

    df.merge(pd.DataFrame(l, columns=['C1', 'C2']))
    

      C1  C2   C3
    1  A   2  3.1
    3  B   1  1.4
    

    【讨论】:

      【解决方案2】:
      df = pd.DataFrame({
          'C1': ['A','A','A','B', 'B', 'C', 'C'],
          'C2': [1, 2, 3, 1, 2, 1, 2],
          'C3': [2., 3.1, 1.2, 1.4, 2.1, .4, .5]
      })
      df[df[["C1","C2"]].apply(tuple, 1).isin([('A', 2), ('B', 1)])]
      
      C1 C2 C3
      1 A 2 3.1
      3 B 1 1.4

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-03-01
        • 2020-11-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多