python - 如果然后这样做:比较 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)
解决方案
由于您只有两个条件,因此只需使用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
推荐阅读
- android - android上线程中的tensorflowinference接口
- android-ndk - 从 getOutputBuffers 显示数据到 ANativeWindow
- flutter - Flutter - 在 CustomScrollView 中如何防止滚动的小部件被绘制在固定的小部件后面
- git - Visual Studio Code/Git:有什么方法可以防止在主分支上进行编辑,但允许合并?
- mysql - 当字符串值不正确时如何在mysql中转换字段字符?
- python - 如何在pyparse语法中定义一个可选词?
- javascript - 为什么 document.write 用于写广告?
- sql - 如何为 Select 查询中的重复行创建 Seq No?
- html - 为移动视图正确设置 CSS 样式?
- python - 在 python/tkinter 上将值从子窗口传递到父窗口