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

问题描述 投票:40回答:5

我有一个DataFrame df

    A    B
a   2    2 
b   3    1
c   1    3

我想根据以下标准创建一个新列:

如果行A == B: 0

如果rowA > 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个新列,然后结合结果)?

python pandas conditional
5个回答
74
投票

为了形式化上面列出的一些方法:

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

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背景。


18
投票
df.loc[df['A'] == df['B'], 'C'] = 0
df.loc[df['A'] > df['B'], 'C'] = 1
df.loc[df['A'] < df['B'], 'C'] = -1

使用索引很容易解决。第一行代码读取如此,如果列'A'等于列'B',则创建并设置列'C'等于0.注意我没有尝试运行它,因此代码可能需要修改对于以下内容,df.loc [(df ['A'] == df ['B']),'C'] = 0,它使用条件周围的括号。


8
投票

对于这种特殊的关系,你可以使用np.sign

>>> df["C"] = np.sign(df.A - df.B)
>>> df
   A  B  C
a  2  2  0
b  3  1  1
c  1  3 -1

2
投票

enter image description here

让我们说上面一个是您的原始数据框,并且您想要添加一个新列“旧”

如果年龄大于50岁,那么我们认为年龄较大=是,否则为假

步骤1:获取年龄大于50的行的索引 row_indexes=df[df['age']>=50].index 第2步:使用.loc我们可以为列分配一个新值 df.loc[row_indexes,'elderly']="yes"

年龄低于50岁时同样如此 row_indexes=df[df['age']<50].index df[row_indexes,'elderly']="no"

© www.soinside.com 2019 - 2024. All rights reserved.