我有一个数据框 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 个新列然后组合结果)?
最佳答案
将上面列出的一些方法形式化:
创建一个对数据框的行进行操作的函数,如下所示:
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))
关于python - 根据 if-elif-else 条件创建新列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21702342/