【问题标题】:Pandas - select rows based on values within a list of columnsPandas - 根据列列表中的值选择行
【发布时间】:2020-01-17 07:10:59
【问题描述】:

相关:Selecting with complex criteria from pandas.DataFrame

我有一些数据框:

df = pd.DataFrame({'name': ['apple1', 'apple2', 'apple3', 'apple4', 'orange1', 'orange2', 'orange3', 'orange4'], 
                   'A': [0, 0, 0, 0, 0, 0 ,0, 0], 
                  'B': [0.10, -0.15, 0.25, -0.55, 0.50, -0.51, 0.70, 0], 
                  'C': [0, 0, 0.25, -0.55, 0.50, -0.51, 0.70, 0.90],
                  'D': [0.10, -0.15, 0.25, 0, 0.50, -0.51, 0.70, 0.90]})
df
name    A   B   C   D
0   apple1  0   0.10    0.00    0.10
1   apple2  0   -0.15   0.00    -0.15
2   apple3  0   0.25    0.25    0.25
3   apple4  0   -0.55   -0.55   0.00
4   orange1 0   0.50    0.50    0.50
5   orange2 0   -0.51   -0.51   -0.51
6   orange3 0   0.70    0.70    0.70
7   orange4 0   0.00    0.90    0.90

现在假设我想在ABCD 中选择值小于 0.25 的所有行:

df[(df['A'] < 0.25) & 
  (df['B'] < 0.25) &
  (df['C'] < 0.25) &
  (df['D'] < 0.25)]
    name    A   B   C   D
0   apple1  0   0.10    0.00    0.10
1   apple2  0   -0.15   0.00    -0.15
3   apple4  0   -0.55   -0.55   0.00
5   orange2 0   -0.51   -0.51   -0.51

很好,但是我可以使用列列表作为输入来达到同样的效果吗?

想象一下,我想过滤 100 列而不是 4 列。

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    在这种情况下,由于您在多个列上具有相同的条件,您可以使用.all over axis=1 来检查所有 选定列的条件是否为True

    df[df.loc[:, 'A':].lt(0.25).all(axis=1)]
    
          name  A     B     C     D
    0   apple1  0  0.10  0.00  0.10
    1   apple2  0 -0.15  0.00 -0.15
    3   apple4  0 -0.55 -0.55  0.00
    5  orange2  0 -0.51 -0.51 -0.51
    

    如果您的列没有很好地排序,请使用双括号来选择您的数据:

    df[df[['A', 'B', 'C', 'D']].lt(0.25).all(axis=1)]
    

    注意: .lt&lt; 相同,代表 "less than"


    如果你有很多列只有一个字母,手动选择太多了,我们可以使用DataFrame.filterregex

    df[df.filter(regex='[A-Z]').lt(0.25).all(axis=1)]
    

    【讨论】:

      【解决方案2】:

      使用DataFrame.allaxis=1 来执行boolean indexing

      df[(df[['A','B','C','D']]<0.25).all(axis=1)]
      

      输出

            name  A     B     C     D
      0   apple1  0  0.10  0.00  0.10
      1   apple2  0 -0.15  0.00 -0.15
      3   apple4  0 -0.55 -0.55  0.00
      5  orange2  0 -0.51 -0.51 -0.51
      

      另一种方法:pd.Index.difference

      df[df[df.columns.difference(['name'])].lt(0.25).all(axis=1)]
      

      【讨论】:

      • 很好,我将添加filter 以显示他如何通过正则表达式过滤列(因为他可能有 100+)或 iloc.loc 到整数或命名切片列
      猜你喜欢
      • 1970-01-01
      • 2013-10-09
      • 1970-01-01
      • 1970-01-01
      • 2021-11-10
      • 1970-01-01
      • 2017-01-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多