小编典典

根据if-elif-else条件创建新列

python

我有一个DataFrame df

    A    B
a   2    2 
b   3    1
c   1    3

我想根据以下条件创建一个新列:

如果行 A == B: 0

如果行A > B: 1

如果行 A < B: -1

因此,鉴于上表,应为:

    A    B    C
a   2    2    0
b   3    1    1
c   1    3   -1

对于典型的if else情况np.where(df.A > df.B, 1, -1),pandas是否提供一种特殊的语法来一步解决我的问题(无需创建3个新列,然后合并结果)?


阅读 181

收藏
2021-01-20

共1个答案

小编典典

要使上面列出的一些方法正式化:

创建一个对数据框的行进行操作的函数,如下所示:

def f(row):
    if row['A'] == row['B']:
        val = 0
    elif row['A'] > row['B']:
        val = 1
    else:
        val = -1
    return val

然后通过axis=1选项将其应用于您的数据框:

In [1]: df['C'] = df.apply(f, axis=1)

In [2]: df
Out[2]:
   A  B  C
a  2  2  0
b  3  1  1
c  1  3 -1

当然,这不是矢量化的,因此在缩放到大量记录时,性能可能会不佳。不过,我认为它更具可读性。特别是来自SAS背景。

编辑

这是向量化版本

df['C'] = np.where(
    df['A'] == df['B'], 0, np.where(
    df['A'] >  df['B'], 1, -1))
2021-01-20