【问题标题】:Pandas filtering with multiple conditionsPandas 过滤多个条件
【发布时间】:2020-02-06 18:50:49
【问题描述】:

我正在尝试使用 .isin

过滤具有多个条件的数据

我用这样的数据创建了一个数据框。

    col_a   col_b   col_c
    abc     yes     a
    abc     no      b
    abc     yes     a
    def     no      b
    def     yes     a
    def     no      b
    def     yes     a
    def     no      b
    ghi     yes     a
    ghi     no      b
    ghi     yes     a

当我尝试这种类型的过滤时,参考我在堆栈溢出时看到的这个解决方案,我得到 返回所有 NaN 值。 Pandas: Filtering multiple conditions

如何应用这三个条件进行过滤?

fil_1 = test.isin({'col_a': ['abc','def','ghi']})
fil_2 = test.isin({'col_b': ['yes']})
fil_3 = test.isin({'col_c' :['a']})
data = test[fil_1 & fil_2 & fil_3]
data

【问题讨论】:

  • fil_1 & fil_2 & fil_3 对于 DataFrame 中的所有单元格都为 False,所以你会得到一个带有 NaN 值的 DataFrame。您确定要使用&
  • 我不确定我明白了我可以看到第二行甚至应该在上面的代码中返回,'abc' 在 col_1 中,'yes' 在 col_2 和 'a'在 col_3 中

标签: python pandas numpy


【解决方案1】:

你需要:

fil_1 = test['col_a'].isin(['abc','def','ghi'])
fil_2 = test['col_b'].isin(['yes'])
fil_3 = test['col_c'].isin(['a'])

test.isin({'col_a': ['abc','def','ghi'],
           'col_b': ['yes'],
           'col_c' :['a']}).all(axis = 1)

df_filtered = test[fil_1 & fil_2 & fil_3]
print(df_filtered)
   col_a col_b col_c
0    abc   yes     a
2    abc   yes     a
4    def   yes     a
6    def   yes     a
8    ghi   yes     a
10   ghi   yes     a

或逻辑|

fil = test.isin({'col_a': ['abc','def','ghi'],'col_b': ['yes'],'col_c' :['a']})
df_filtered = df[fil]
print(df_filtered)

   col_a col_b col_c
0    abc   yes     a
1    abc   NaN   NaN
2    abc   yes     a
3    def   NaN   NaN
4    def   yes     a
5    def   NaN   NaN
6    def   yes     a
7    def   NaN   NaN
8    ghi   yes     a
9    ghi   NaN   NaN
10   ghi   yes     a

现在如果我们也使用DataFrame.all:

df_filtered = df[fil.all(axis = 1)]
print(df_filtered)
   col_a col_b col_c
0    abc   yes     a
2    abc   yes     a
4    def   yes     a
6    def   yes     a
8    ghi   yes     a
10   ghi   yes     a

详情

print(fil)
    col_a  col_b  col_c
0    True   True   True
1    True  False  False
2    True   True   True
3    True  False  False
4    True   True   True
5    True  False  False
6    True   True   True
7    True  False  False
8    True   True   True
9    True  False  False
10   True   True   True

print(test.isin({'col_a': ['abc','def','ghi']}))
    col_a  col_b  col_c
0    True  False  False
1    True  False  False
2    True  False  False
3    True  False  False
4    True  False  False
5    True  False  False
6    True  False  False
7    True  False  False
8    True  False  False
9    True  False  False
10   True  False  False

这返回 False 在列差异中比 col_a 所以你得到了NaN的值,因为你使用的是&

【讨论】:

    【解决方案2】:

    这是单线解决方案,

    test[test.col_a.isin(['abc','def','ghi']) & test.col_b.isin(['yes']) & test.col_c.isin(['a'])]
    

    【讨论】:

      【解决方案3】:

      过滤数据框的可能解决方案如下: "cond1" 选择 col_a 中的所有值,即 "abc" 或 "def" 或 "ghi"。 那么col_b只有“yes”,col_c只有“a”。

      cond1=(apd.col_a=="abc") | (apd.col_a=="def") | (apd.col_a=="ghi")
      
      apd[ cond1 & (apd.col_b=="yes") & (apd.col_c=="a")]
      

      结果:

          col_a   col_b   col_c
      0   abc     yes     a
      2   abc     yes     a
      4   def     yes     a
      6   def     yes     a
      8   ghi     yes     a
      10  ghi     yes     a
      

      【讨论】:

        猜你喜欢
        • 2021-09-01
        • 2022-01-09
        • 1970-01-01
        • 2017-03-07
        • 2021-11-04
        • 2020-08-29
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多