Python Pandas从另一个数据帧更新数据帧值

Pro*_*Sky 11 python dataframe pandas

我在python中有两个数据帧.我想使用来自另一个数据帧的匹配值来更新第一个数据帧中的行.第二个数据帧用作覆盖.

以下是具有相同数据和代码的示例:

DataFrame 1:

在此输入图像描述

DataFrame 2:

在此输入图像描述

我想根据匹配的代码和名称更新更新数据帧1.在此示例中,Dataframe 1应更新如下:

在此输入图像描述

注意:Code = 2和Name = Company2的行更新为值1000(来自Dataframe 2)

import pandas as pd

data1 = {
         'Code': [1, 2, 3],
         'Name': ['Company1', 'Company2', 'Company3'],
         'Value': [200, 300, 400],

    }
df1 = pd.DataFrame(data1, columns= ['Code','Name','Value'])

data2 = {
         'Code': [2],
         'Name': ['Company2'],
         'Value': [1000],
    }

df2 = pd.DataFrame(data2, columns= ['Code','Name','Value'])
Run Code Online (Sandbox Code Playgroud)

任何指针或提示?

Nic*_*Nic 18

使用DataFrame.update,它对齐索引(https://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.update.html):

>>> df1.set_index('Code', inplace=True)
>>> df1.update(df2.set_index('Code'))
>>> df1.reset_index()  # to recover the initial structure

   Code      Name   Value
0     1  Company1   200.0
1     2  Company2  1000.0
2     3  Company3   400.0
Run Code Online (Sandbox Code Playgroud)

  • 这似乎是所有解决方案中最理想的解决方案...但是 Nic,你能帮我做一件事吗?...如果 df1 和 df2 各有 5 列,但我只想更新“值”列,该怎么办?而不是其余的(上面的代码更新了与该“索引”相关的所有列)...这可能吗?请帮忙... (2认同)

WeN*_*Ben 13

你可以用concat+drop_duplicates

pd.concat([df1,df2]).drop_duplicates(['Code','Name'],keep='last').sort_values('Code')
Out[1280]: 
   Code      Name  Value
0     1  Company1    200
0     2  Company2   1000
2     3  Company3    400
Run Code Online (Sandbox Code Playgroud)

  • 只是想指出,该解决方案不仅更新了条目帧 dataframe1,而且还添加了 dataframe2 中以前不存在于 dataframe1 中的新条目。 (7认同)
  • 它还会耗尽内存,因为它必须在删除重复项之前复制两个数据帧。 (2认同)

Bub*_*Gut 6

您可以先合并数据,然后使用numpy.where,是使用方法numpy.where

updated = df1.merge(df2, how='left', on=['Code', 'Name'], suffixes=('', '_new'))
updated['Value'] = np.where(pd.notnull(updated['Value_new']), updated['Value_new'], updated['Value'])
updated.drop('Value_new', axis=1, inplace=True)

   Code      Name   Value
0     1  Company1   200.0
1     2  Company2  1000.0
2     3  Company3   400.0
Run Code Online (Sandbox Code Playgroud)


小智 6

有可用的更新功能

例子:

df1.update(df2)

更多信息:

https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.update.html


jpp*_*jpp 5

您可以对齐索引,然后使用combine_first

res = df2.set_index(['Code', 'Name'])\
         .combine_first(df1.set_index(['Code', 'Name']))\
         .reset_index()

print(res)

#    Code      Name   Value
# 0     1  Company1   200.0
# 1     2  Company2  1000.0
# 2     3  Company3   400.0
Run Code Online (Sandbox Code Playgroud)