pandas df中的多个逻辑比较

时间:2018-05-02 17:12:49

标签: python pandas dataframe

如果我有以下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

最好的办法是什么?

3 个答案:

答案 0 :(得分:4)

您可以使用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。该解决方案的主要优点是可读性,同时保持矢量化。

答案 1 :(得分:1)

这也可以使用索引和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&gt;的位置B和B&gt; C,如果这两个条件均为真,则设置列&#39; New_Col&#39;等于1.第二个块可以用相同的方式解释。如果第一个和第二个块都没有返回1或2,那么它们将显示为null。使用fillna()函数用3填充这些空值。

这将产生以下数据帧:

enter image description here

答案 2 :(得分:0)

您可以在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)