首页 > 解决方案 > 如果然后这样做:比较 Python 中的两列以创建新列

问题描述

我想使用以下逻辑创建新列并赋值:

如果 IN>OUT 然后给出值 1

否则给值 0

下面的代码可以正常工作,但我想要一些更“可读”的东西,比如其他语言,比如 SAS。

df = pd.DataFrame({'id': [1,2,3,4,5,6,7,8,9],
                   'In': [111, 100, 31, 1100, 12, 33, 21, 32, 33],
                   'Out': [24, 52, 34, 95, 98, 54, 32, 20, 16]})
print(df)

conditions = [
    (df['In'] >= df['Out']),
    df['In'] < df['Out']]

choices = [df['In'].shift(1), 0]

df['check'] = np.select(conditions, choices, default=np.nan)
print(df)

标签: pythonpandas

解决方案


由于您只有两个条件,因此只需使用np.where

df['check'] = np.where(df['In'] >= df['Out'], df['In'].shift(), 0)

>>> df
   id    In  Out  check
0   1   111   24    NaN
1   2   100   52  111.0
2   3    31   34    0.0
3   4  1100   95   31.0
4   5    12   98    0.0
5   6    33   54    0.0
6   7    21   32    0.0
7   8    32   20   21.0
8   9    33   16   32.0
>>> 

或者如果你有更多,写一个函数:

def func(x):
    if x['In'] >= x['Out']:
        if x.name:
            return df.loc[x.name - 1 , 'In']
        else:
            return np.nan
    elif x['In'] < x['Out']:
        return 0
    return np.nan

df['check'] = df.apply(func, axis=1)

print(df)

输出:

   id    In  Out  check
0   1   111   24    NaN
1   2   100   52  111.0
2   3    31   34    0.0
3   4  1100   95   31.0
4   5    12   98    0.0
5   6    33   54    0.0
6   7    21   32    0.0
7   8    32   20   21.0
8   9    33   16   32.0

推荐阅读