Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/351.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 从满足特定条件的列映射字典中的值_Python_Pandas_Dictionary_For Loop_Mapping - Fatal编程技术网

Python 从满足特定条件的列映射字典中的值

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'] =

我一直在使用传统的字典映射方法创建一个新的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'] = ''

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