nut*_*hip 57 python conditional pandas
我有一个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个新列然后组合结果)?  
Zel*_*ny7 90
为了形式化上面列出的一些方法:
创建一个对数据帧的行进行操作的函数,如下所示:
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背景.
Bri*_*ian 23
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.ix [(df ['A'] == df ['B']),'C'] = 0,它使用条件周围的括号.
May*_*wal 12
当您有多个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
对于这种特殊关系,您可以使用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
假设上面的一个是您的原始数据框,并且您想添加一个新列“旧”
如果年龄大于 50,那么我们认为是 old=yes 否则为 False
步骤 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"