【问题标题】:Mutliple filters on rows of a DataFrame based on list of values基于值列表的 DataFrame 行上的多个过滤器
【发布时间】:2020-07-20 13:08:20
【问题描述】:

假设我有一个如下的 DataFrame:

   Col1 Col2 Col3
0   0   a   361
1   0   b   92
2   0   c   909
3   0   d   114
4   0   e   914
5   0   f   732
6   1   a   738
7   1   b   744
8   1   c   345
9   1   d   141
10  1   e   771
11  1   f   206
12  2   a   367
13  2   b   133
14  2   c   509
15  2   d   968
16  2   e   527
17  2   f   288
18  3   a   231
19  3   b   673
20  3   c   925
21  3   d   760
22  3   e   491
23  3   f   741

我希望根据下面的给定列表过滤掉几行(从两列 Col1Col2),

[[0, 'a'],[0, 'd'],[1, 'b'],[2, 'a'],[3, 'e']]

所以这应该过滤 DataFrame 并给我:

 Col1 Col2 Col3
0   0   a   37
3   0   d   37
7   1   b   143
12  2   a   170
22  3   e   46

我不能进行价值筛选,也不能使用循环,因为在我的情况下,我有一个巨大的数据框。请帮帮我。

【问题讨论】:

    标签: python python-3.x list dataframe


    【解决方案1】:

    这可以通过简单的合并来完成。

    l = [[0, 'a'],[0, 'd'],[1, 'b'],[2, 'a'],[3, 'e']]
    df.merge(pd.DataFrame(l, columns = ['Col1', 'Col2']))
    

    输出

        Col1    Col2    Col3
    0   0       a       361
    1   0       d       114
    2   1       b       744
    3   2       a       367
    4   3       e       491
    

    【讨论】:

      【解决方案2】:

      使用具有两个条件的布尔掩码:

      import pandas as pd
      
      df = pd.DataFrame([
          [0, "a", 361],
          [0, "b", 92],
          [0, "c", 909],
          [0, "d", 114],
          [0, "e", 914],
          [0, "f", 732],
          [1, "a", 738],
          [1, "b", 744],
          [1, "c", 345],
          [1, "d", 141],
          [1, "e", 771],
          [1, "f", 206],
          [2, "a", 367],
          [2, "b", 133],
          [2, "c", 509],
          [2, "d", 968],
          [2, "e", 527],
          [2, "f", 288],
          [3, "a", 231],
          [3, "b", 673],
          [3, "c", 925],
          [3, "d", 760],
          [3, "e", 491],
          [3, "f", 741]
      ], columns=["Col1", "Col2", "Col3"]
      )
      
      l = [[0, 'a'],
           [0, 'd'],
           [1, 'b'],
           [2, 'a'],
           [3, 'e']]
      
      filt = ((df['Col1'].isin(l[:][0])) & (df['Col2'].isin(l[:][1])))
      print(df[filt])
      

      返回:

         Col1 Col2  Col3
      3     0    d   114
      

      或者只是满足其中一个条件:

      filt = ((df['Col1'].isin(l[:][0])) | (df['Col2'].isin(l[:][1])))
      print(df[filt])
      

      给予:

          Col1 Col2  Col3
      0      0    a   361
      1      0    b    92
      2      0    c   909
      3      0    d   114
      4      0    e   914
      5      0    f   732
      9      1    d   141
      15     2    d   968
      21     3    d   760
      

      如果这会导致您的内存溢出,请考虑从 pandas 迁移到 pyspark。您可以运行命令:例如spark.createDataFrame

      【讨论】:

      • 知道了!谢谢,古斯塔夫。
      • 我的荣幸。享受编码:)
      猜你喜欢
      • 1970-01-01
      • 2021-01-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多