【问题标题】:Multiple logical comparisons in pandas dfpandas df中的多重逻辑比较
【发布时间】:2018-05-03 01:57:48
【问题描述】:

如果我有以下 pandas df

A   B   C   D
1   2   3   4
2   2   3   4

我想根据情况添加一个新列为 1、2 或 3,

(A > B) && (B > C) = 1
(A < B) && (B < C) = 2
Else = 3

最好的方法是什么?

【问题讨论】:

标签: python pandas dataframe


【解决方案1】:

您可以使用numpy.select 来构建您的多个条件。最后一个参数代表默认值。

conditions = [(df.A > df.B) & (df.B > df.C),
              (df.A < df.B) & (df.B < df.C)]

values = [1, 2]

df['E'] = np.select(conditions, values, 3)

有几种选择:嵌套numpy.where、顺序pd.DataFrame.locpd.DataFrame.apply。此解决方案的主要优点是可读性,同时保持矢量化。

【讨论】:

    【解决方案2】:

    您可以在 df 上使用 apply 并满足您的两个条件,例如:

    df['E'] = df.apply(lambda x: 1 if x.A > x.B and x.B > x.C else 2 if x.A < x.B and x.B < x.C else 3, axis=1)
    

    【讨论】:

      【解决方案3】:

      这也可以使用 indexing 和 fillna 来解决。

      df.loc[(df['A'] > df['B'])
        &(df['B'] > df['C']), 'New_Col'] = 1
      
      df.loc[(df['A'] < df['B'])
        &(df['B'] < df['C']), 'New_Col'] = 2
      
      df['New_Col'] = df['New_Col'].fillna(3)
      

      第一个代码块的读取方式如下:定位 A > B 和 B > C 的位置,如果这两个条件都为真,则设置列 'New_Col' 等于 1。第二个块可以解释为相同方法。如果第一个和第二个块都没有返回 1 或 2,那么它们将显示为 null。使用 fillna() 函数用 3 填充这些空值。

      这将产生以下数据框:

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-09-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多