【问题标题】:Updating a dataframe rows based on another dataframe rows根据另一个数据框行更新数据框行
【发布时间】:2020-10-02 21:37:16
【问题描述】:

我有两个数据框,需要根据较小数据框的数据更新一个更大的数据框。所以基本上,如果有一条名称匹配的记录,我想更新 df1 中的价格,就像下面的示例一样。 df1 中可能有多个同名的行

df1

id name price 

1 name_1 5,34 

2 name_2 5,36 

3 name_3 4,74 

4 name_4 5,23 

5 name_5 5,94 

6 name_1 5,34 

df2

name price 

name_4 5,17 

name_1 5,37

df_result

id name price 

1 name_1 5,37 

2 name_2 5,36 

3 name_3 4,74 

4 name_4 5,17 

5 name_5 5,94 

6 name_1 5,37

我很困惑。尝试使用 df.loc[] 执行此操作,但我一无所获。有什么想法吗?

【问题讨论】:

  • Tried doing this with df.loc[] but I got nowhere - 将您尝试的代码添加到您的问题中
  • 使用pd.concat([df1,df2]).drop_duplicates(subset=['name'], keep='last')
  • 或者df1.merge(df2, on="name", how="left").ffill(axis=1).drop("price_x", axis=1)
  • @jezrael 您的方法不会保留替换行上的 "id" 列(如果重要,也不会保留索引)。我不确定这是完全重复的。
  • @Dan - 同意,重新打开

标签: python pandas dataframe


【解决方案1】:

您正在尝试进行多个一对一匹配,merge 可以在这里为您提供帮助:

df1.merge(df2, on="name", how="left").ffill(axis=1).drop("price_x", axis=1)

通过进行左连接,您可以保留 df1 中在 df2 中没有匹配项的所有值。 ffill 然后在您保留最右边的非空列的地方进行空合并。


另一个基于 Sandeep 回答的选项:

df3 = df1.set_index("name")
df3.update(df2.set_index("name")).reset_index()

【讨论】:

  • 我更新了我的问题。我没有写一件重要的事情 - 有些地方有多行具有相同的名称但具有不同的 id
  • @TomaszSłowik 我认为我的解决方案适用于这种情况......?
  • 确实如此!谢谢 :) 不得不玩,因为我的数据有些混乱。
  • @TomaszSłowik btw 检查我对 Sandeeps 答案的评论,它可能对你来说更干净
【解决方案2】:

你可以使用更新......像这样......

df1.update(df2)

【讨论】:

  • 如果您先将索引设置为名称,这可能会起作用。所以df3 = df1.set_index("name") 然后df3.update(df2.set_index("name")).reset_index()
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-27
  • 2016-08-07
  • 1970-01-01
  • 2019-10-14
  • 1970-01-01
  • 2023-01-18
相关资源
最近更新 更多