基于另一列值替换Pandas DataFrame中Reorder列值的实现
处理Pandas DataFrame的Reorder列
需求说明
给定如下DataFrame:
import pandas as pd df = pd.DataFrame({ 'Material': ['E01', 'E02', 'E03', 'E04', 'E05', 'E06', 'E07', 'E08', 'E09'], 'Min_lot': [1, 1, 1, 1, 5, 5, 5, 5, 5], 'Reorder': [0, -1, 10, 1, 0, -1, 10, 5, 3] })
需要按照以下规则修改Reorder列(或创建新列):
- 当
Reorder < 0时,替换为0 - 当
Reorder >= Min_lot时,保持原值 - 当
Reorder < Min_lot且Reorder >=0时,替换为Min_lot的值
解决方案
推荐两种高效的向量化实现方式,避免使用低效的循环或apply方法:
方法1:max与clip组合(简洁高效)
通过两步向量化操作直接完成所有规则:
import pandas as pd # 原始数据 df = pd.DataFrame({ 'Material': ['E01', 'E02', 'E03', 'E04', 'E05', 'E06', 'E07', 'E08', 'E09'], 'Min_lot': [1, 1, 1, 1, 5, 5, 5, 5, 5], 'Reorder': [0, -1, 10, 1, 0, -1, 10, 5, 3] }) # 创建处理后的新列(若要替换原列,直接赋值给df['Reorder']即可) df['Reorder_Processed'] = df[['Reorder', 'Min_lot']].max(axis=1).clip(lower=0)
逻辑说明:
df[['Reorder', 'Min_lot']].max(axis=1):对每行取Reorder和Min_lot的最大值,自动覆盖"Reorder < Min_lot则替换为Min_lot"的规则.clip(lower=0):将所有小于0的值替换为0,处理"Reorder < 0则替换为0"的规则
方法2:嵌套numpy.where(逻辑清晰)
如果需要明确拆分规则逻辑,可使用嵌套条件判断:
import pandas as pd import numpy as np df = pd.DataFrame({ 'Material': ['E01', 'E02', 'E03', 'E04', 'E05', 'E06', 'E07', 'E08', 'E09'], 'Min_lot': [1, 1, 1, 1, 5, 5, 5, 5, 5], 'Reorder': [0, -1, 10, 1, 0, -1, 10, 5, 3] }) df['Reorder_Processed'] = np.where( df['Reorder'] < 0, 0, np.where(df['Reorder'] >= df['Min_lot'], df['Reorder'], df['Min_lot']) )
逻辑说明:
- 第一层判断:若
Reorder <0,直接返回0 - 第二层判断:若
Reorder >= Min_lot,保留原Reorder值,否则返回Min_lot值
处理结果
执行代码后得到的最终DataFrame如下:
Material Min_lot Reorder Reorder_Processed 0 E01 1 0 1 1 E02 1 -1 0 2 E03 1 10 10 3 E04 1 1 1 4 E05 5 0 5 5 E06 5 -1 0 6 E07 5 10 10 7 E08 5 5 5 8 E09 5 3 5
内容的提问来源于stack exchange,提问作者Rolando Azevedo
相关产品推荐
相关产品推荐

