pandas 基于if-elif-else条件创建新列

ldioqlga  于 2023-06-04  发布在  其他
关注(0)|答案(7)|浏览(434)

我有一个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个新列,然后组合结果)?

nmpmafwu

nmpmafwu1#

将上述一些方法正式化:
创建一个函数,对dataframe的行进行操作,如下所示:

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

然后将其应用于传入axis=1选项的 Dataframe :

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))
whitzsjs

whitzsjs2#

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。

mwkjh3gx

mwkjh3gx3#

对于这个特定的关系,您可以使用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
2sbarzqh

2sbarzqh4#

当您有多个if条件时,numpy.select是一种选择:

In [4102]: import numpy as np
In [4098]: conditions = [df.A.eq(df.B), df.A.gt(df.B), df.A.lt(df.B)]
In [4096]: choices = [0, 1, -1]

In [4100]: df['C'] = np.select(conditions, choices)

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

k75qkfdt5#

假设上面的一个是你原来的dataframe,你想添加一个新的列'old'

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

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

年龄小于50岁

row_indexes=df[df['age']<50].index
df[row_indexes,'elderly']="no"

vc6uscn9

vc6uscn96#

可以使用mask方法:

df['C'] = np.nan
df['C'] = df['C'].mask(df.A == df.B, 0).mask(df.A > df.B, 1).mask(df.A < df.B, -1)
tf7tbtn2

tf7tbtn27#

一个线性解决方案,list comprehensionzip()也是

df.loc[:,'C']= [0 if d1==d2 else 1 if d1>d2 else -1 for d1,d2 in zip(df.A,df.B)]

返回所需的输出

相关问题