Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/.htaccess/6.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_Dataframe - Fatal编程技术网

Python 如果满足条件,则根据另一个数据帧中的匹配更新数据帧

Python 如果满足条件,则根据另一个数据帧中的匹配更新数据帧,python,pandas,dataframe,Python,Pandas,Dataframe,我有两个数据帧,我想更新第一个。 df1包含不同的市场(M1、M2等)和每个市场的一些代码(数字或虚拟) 如果Code==Dummy,那么我想根据这个特定市场的df2中的值更新df中的代码。因此,每个市场都应该收到不同的新代码 labels = ["Market","Code(New)"] values = [["M1","4567"],["M2","5678"]] df2 = pd.DataFrame.from_records(values,columns=labels) print(df2)

我有两个数据帧,我想更新第一个。 df1包含不同的市场(M1、M2等)和每个市场的一些代码(数字或虚拟)

如果Code==Dummy,那么我想根据这个特定市场的df2中的值更新df中的代码。因此,每个市场都应该收到不同的新代码

labels = ["Market","Code(New)"]
values = [["M1","4567"],["M2","5678"]]
df2 = pd.DataFrame.from_records(values,columns=labels)
print(df2)
 Market Code(New)
0     M1      4567
1     M2      5678
最后我应该得到

labels = ["Market","Code"]
values = [["M1","1234"],["M1","4567"],["M1","1234"],["M2","5678"],["M1","1234"]]
df_clean = pd.DataFrame.from_records(values,columns=labels)
print(df_clean)
  Market  Code
0     M1  1234
1     M1  4567
2     M1  1234
3     M2  5678
4     M1  1234
以你的例子为基础

pd.concat([df1[df1.Code!='Dummy'],df2],axis=0)
在我发布我的答案后,您编辑了输入,下面是更新输入的解决方案

df2.columns=["Market","Code"]
df2.index=df[df.Code=='Dummy'].index
pd.concat([df[df.Code!='Dummy'],df2],axis=0).sort_index()


Out[372]: 
  Market  Code
0     M1  1234
1     M1  4567
2     M1  1234
3     M2  5678
4     M1  1234

使用
市场上的
.merge
.loc
作为
df.code=='Dummy'
值的子集

In [288]: df.loc[df.Code=='Dummy', 'Code'] = df.merge(df2, on='Market', how='left')['Code(New)']

In [289]: df
Out[289]:
  Market  Code
0     M1  1234
1     M1  4567
2     M1  1234
3     M2  5678
4     M1  1234

嗨,你试过什么代码?为什么不起作用?谢谢你的回答,但是如果你在df中有多行要为同一个市场编辑,它会起作用吗?@Nicolas,如果在同一个市场下有多行需要更新,如何区分相同的市场名称?不需要。这只是更大计划的一部分;)我试过这样的代码:
index=[“MKT\u BUD”,“CUSTOMER”]
df.loc[df.CUSTOMER=='OTHEROE','CUSTOMER']=df.merge(df2,how=“inner”,left\u on=index,right\u on=index)[“New CUSTOMER”]值,但结果很奇怪,似乎它没有根据正确的市场正确地编辑每一行。我在这里为这个问题创建了一个专门的主题:
In [288]: df.loc[df.Code=='Dummy', 'Code'] = df.merge(df2, on='Market', how='left')['Code(New)']

In [289]: df
Out[289]:
  Market  Code
0     M1  1234
1     M1  4567
2     M1  1234
3     M2  5678
4     M1  1234