Python 如果满足条件,则根据另一个数据帧中的匹配更新数据帧
我有两个数据帧,我想更新第一个。 df1包含不同的市场(M1、M2等)和每个市场的一些代码(数字或虚拟) 如果Code==Dummy,那么我想根据这个特定市场的df2中的值更新df中的代码。因此,每个市场都应该收到不同的新代码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)
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