【问题标题】:Update dataframe based on match in another dataframe if condition is met如果满足条件,则根据另一个数据帧中的匹配更新数据帧
【发布时间】:2017-08-14 14:30:14
【问题描述】:

我有两个数据框,我想更新第一个。 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

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

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

【问题讨论】:

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

标签: python pandas dataframe


【解决方案1】:

Market.loc 上使用.merge 作为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

【讨论】:

  • 我试过这段代码:index=["MKT_BUD","CUSTOMER"]df.loc[df.CUSTOMER=='OTHEROE','CUSTOMER'] = df.merge(df2,how="inner",left_on=index,right_on=index)["New CUSTOMER"].values 但是结果比较奇怪,好像没有根据正确的Market正确编辑每一行
  • 我在这里为这个问题创建了一个专门的主题:stackoverflow.com/questions/45737332/…
【解决方案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

【讨论】:

  • 感谢您的回答,但如果您在 df 中为同一市场编辑多行,它会起作用吗?
  • @Nicolas,如果是同一个market下多行需要更新,同一个Market name如何区分?
  • 不需要。这只是更大计划的一部分;)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-06
  • 1970-01-01
  • 1970-01-01
  • 2021-05-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多