【问题标题】:Get indices of columns satisfying multiple conditions in new column with pandas使用熊猫在新列中获取满足多个条件的列的索引
【发布时间】:2020-10-12 00:22:37
【问题描述】:

以以下数据框为例:

df = pd.DataFrame({'Sample':['X', 'Y', 'Z'], 'Base':[2, 10, 3], 'A':[0,5,100], 'C':[0,10,7]})

我想添加一个名为df["indices"] 的新列,其中包含df["A"] 和/或df["C"] 列的索引,前提是它们满足两个条件:

  1. 必须大于 5
  2. df["A"]/df["Base"]df["C"]/df["Base"] 必须大于等于 1

生成的数据框将是:

df = pd.DataFrame({'Sample':['X', 'Y', 'Z'], 'Base':[2, 20, 3], 'A':[0,6,100], 'C':[0,10,7], 'indices': ['','C','A,C']})

我可以使用df[['A','C']] > 5 为我的第一个条件获取 True 或 False 值,但我无法让它与我的条件 2 一起使用,该条件 2 基于我的数据框中的另一列。在新列中获取我得到 True 的索引是另一回事。我想像 apply 和 get_loc 或 index 的东西,但无论如何我都无法让它工作。

【问题讨论】:

    标签: python pandas dataframe


    【解决方案1】:

    让我们创建一个满足两个给定条件的布尔掩码,然后在此掩码上使用DataFrame.dot 来获取索引:

    m = df[['A', 'C']].gt(5) & df[['A', 'C']].div(df['Base'], axis=0).ge(1)
    df['indices'] = m.dot(m.columns + ',').str.rstrip(',')
    

      Sample  Base    A   C indices
    0      X     2    0   0        
    1      Y    10    5  10       C
    2      Z     3  100   7     A,C
    

    【讨论】:

      【解决方案2】:

      当满足任意数量的条件时,您可以使用df.loc 将值分配回列。一个简单的方法是拥有其中的 3 个,每个都有您想要的条件。如果您愿意,您也可以将np.where 链接在一起以实现相同的目标。

      import pandas as pd
      
      df = pd.DataFrame({'Sample':['X', 'Y', 'Z'], 
                         'Base':[2, 10, 3], 
                         'A':[0,5,100], 
                         'C':[0,10,7]})
      
      df.loc[(df['A'] / df['Base'] >=1) & (df['C'] / df['Base'] >=1), 'indicies'] = 'A,C'
      df.loc[(df['A'] / df['Base'] >=1) & (df['C'] / df['Base'] <1), 'indicies'] = 'A'
      df.loc[(df['A'] / df['Base'] <1) & (df['C'] / df['Base'] >=1), 'indicies'] = 'C'
      

      输出

         Sample   Base      A     C   indicies
      0       X      2      0     0       NaN
      1       Y     10      5    10         C
      2       Z      3    100     7       A,C
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-08-14
        • 1970-01-01
        • 1970-01-01
        • 2018-04-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多