我有一个DataFrame df:
df
A B a 2 2 b 3 1 c 1 3
我想根据以下条件创建一个新列:
如果行 A == B: 0
A == B: 0
如果行A > B: 1
A > B: 1
如果行 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个新列,然后合并结果)?
if else
np.where(df.A > df.B, 1, -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选项将其应用于您的数据框:
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))