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

我有一个数据帧 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),熊猫提供了一个特殊的语法来解决我的问题一步(没有必要创建3个新的列,然后结果组合) ?

330701 次浏览

对于这种特殊的关系,您可以使用 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

使上述一些办法正式化:

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

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

当然,这不是向量化的,因此当扩展到大量记录时,性能可能不会那么好。尽管如此,我还是认为它更具可读性。特别是有特种部队背景的。

剪辑

这是矢量化的版本

df['C'] = np.where(
df['A'] == df['B'], 0, np.where(
df['A'] >  df['B'], 1, -1))
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。

enter image description here

假设上面的一个是你的原始数据框架,你想添加一个新的列’旧’

如果年龄大于50岁,那么我们认为年龄大 = 否则是错误的

步骤1: 获取年龄大于50的行的索引

row_indexes=df[df['age']>=50].index < br > < br > 第二步: 使用. loc,我们可以为 column < br > < br > 赋一个新值 df.loc[row_indexes,'elderly']="yes"

50岁以下人士同样适用

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

当你有多个 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

你可以使用方法 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)