2017-08-14 58 views
2

我有两个数据框,我想更新第一个数据框。 DF1包含不同的市场(M1,M2等)和一些代码为每个(数字或虚拟)的如果满足条件,则根据另一个数据框中的匹配更新数据帧

import pandas as pd 
labels = ["Market","Code"] 
values = [["M1","1234"],["M1","Dummy"],["M1","1234"],["M2","Dummy"],["M1","1234"]] 
df = pd.DataFrame.from_records(values,columns=labels) 
print(df) 
Market Code 
0  M1 1234 
1  M1 Dummy 
2  M1 1234 
3  M2 Dummy 
4  M1 1234 

如果代码==假的话,我想基础上,更新代码的DF这个特定市场的价值为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 
+0

嗨,什么代码,你试过吗?为什么它不起作用? – Adam

回答

3

Market.locdf.Code == 'Dummy'

的子集使用 .merge
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 
+0

我试过这段代码: 'index = [“MKT_BUD”,“CUSTOMER”]' 'df.loc [df.CUSTOMER =='OTHEROE','CUSTOMER '] = df.merge(df2,how =“inner”,left_on = index,right_on = index)[“New CUSTOMER”] values' 但是结果很奇怪,似乎没有正确编辑每个线根据市场 – Nicolas

+0

我已经在这里为此问题创建了一个专门的主题:https://stackoverflow.com/questions/45737332/use-df-merge-to-populate-a-new-column-in-df-给予奇怪的匹配 – Nicolas

+0

好了,现在一切都解决了。感谢您的帮助! – Nicolas

2

此基础上你的榜样

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 
+0

@JohnGalt,更新。谢谢〜:-) – Wen

+0

谢谢你的回答,但是如果你在df中有多行可以在同一个市场进行编辑,它会起作用吗? – Nicolas

+0

@Nicolas,如果是多行需要在同一个市场下更新,如何区分同一个市场名称? – Wen

相关问题