Python 从满足特定条件的列映射字典中的值
我一直在使用传统的字典映射方法创建一个新的Pandas列,如下所示:Python 从满足特定条件的列映射字典中的值,python,pandas,dictionary,for-loop,mapping,Python,Pandas,Dictionary,For Loop,Mapping,我一直在使用传统的字典映射方法创建一个新的Pandas列,如下所示: product_costs = {x: 1, y: 2, z: 3} df['costs'] = df['product'].map(product_costs) 这一直有效到现在,但是最近产品“x”的成本发生了变化——例如,从4月1日起,成本从1增加到了4 我的'df'也有一个日期列,我试图找出如何映射日期列为4月之前的值1和日期列为4月之后的值4 我可能可以使用for循环迭代执行此操作,即: df['costs'] =
product_costs = {x: 1, y: 2, z: 3}
df['costs'] = df['product'].map(product_costs)
这一直有效到现在,但是最近产品“x”的成本发生了变化——例如,从4月1日起,成本从1增加到了4
我的'df'也有一个日期列,我试图找出如何映射日期列为4月之前的值1和日期列为4月之后的值4
我可能可以使用for循环迭代执行此操作,即:
df['costs'] = ''
index = 0
for i in df['product']:
if i == 'x' and df.loc[index, 'date'] < 2021-04-01:
df.loc[index, 'costs'] = 1
index += 1
elif i == 'x' and df.loc[index, 'date'] >= 2021-04-01:
df.loc[index, 'costs'] = 4
index += 1
elif i == 'y':
etc. etc.
成为
date (dd-mm) product cost
01-02 x 1
01-02 y 2
01-02 z 3
01-03 x 1
01-03 y 2
01-03 z 3
01-04 x 4
01-04 y 2
01-04 z 3
np.where()
您可以根据日期条件使用
首先转换日期。假设您的日期缺少年份(%d-%m
),但希望年份为2021年:
df['date']=pd.to_datetime(df['date'],格式='%d-%m')。应用(lambda x:x.replace(year=2021))
然后以日期为条件绘制地图:
costs_pre={'x':1,'y':2,'z':3}
costs_post={'x':4,'y':2,'z':3}
df[‘成本’]=np.where(
df[“日期”]<“2021-04-01”,
df[‘产品’].map(成本_前期),
df['product'].map(成本/岗位))
#日期产品成本
#2021-02-01 x 1
#1 2021-02-01 y 2
#2021-02-01 z 3
#3 2021-03-01 x 1
#4 2021-03-01 y 2
#5 2021-03-01 z 3
#6 2021-04-01 x 4
#7 2021-04-01 y 2
#8 2021-04-01 z 3
np.select()
如果你有多种条件,你可以筑巢,但会更干净
例如,如果您的成本在01-03发生变化,然后又在01-04发生变化:
costs1={'x':1'y':2'z':3}
成本2={'x':4'y':2'z':3}
成本3={'x':100,'y':2,'z':3}
条件=[df['date']<'2021-03-01',df['date']<'2021-04-01']
选项=[df['product'].map(成本1),df['product'].map(成本2)]
df['costs']=np.select(条件、选项,默认值=df['product'].map(costs3))
#日期产品成本
#2021-02-01 x 1
#1 2021-02-01 y 2
#2021-02-01 z 3
#3 2021-03-01 x 4
#4 2021-03-01 y 2
#5 2021-03-01 z 3
#6 2021-04-01 x 100
#7 2021-04-01 y 2
#8 2021-04-01 z 3
熊猫在这里也很有用 您能提供示例数据吗?当然可以,请参阅编辑。这非常有效,谢谢您的帮助。最后一个问题,如果产品“x”再次改变成本,并且根据数据现在有3个可能的关联值-我的最佳方法是在np.where中包含另一个np.where吗?@SlowlyLearning是的,这是一个选项,但另一个选项是np.select()
。给我一点时间update@SlowlyLearning更新为np.select()
选项
date (dd-mm) product cost
01-02 x 1
01-02 y 2
01-02 z 3
01-03 x 1
01-03 y 2
01-03 z 3
01-04 x 4
01-04 y 2
01-04 z 3