我有两个数据帧,具有相同的列,但不同的值和不同的行数.

import pandas as pd

data1 = {'Region': ['Africa','Africa','Africa','Africa','Africa','Africa','Africa','Africa','Asia','Asia','Asia','Asia'],
         'Country': ['South Africa','South Africa','South Africa','South Africa','South Africa','South Africa','South Africa','South Africa','Japan','Japan','Japan','Japan'],
         'Product': ['ABC','ABC','ABC','ABC','XYZ','XYZ','XYZ','XYZ','DEF','DEF','DEF','DEF'],
         'Year': [2016, 2017, 2018, 2019,2016, 2017, 2018, 2019,2016, 2017, 2018, 2019],
         'Price': [500, 400, 0,450,750,0,0,890,500,470,0,415]}

data1 = {'Region': ['Africa','Africa','Africa','Africa','Africa','Africa','Asia','Asia'],
         'Country': ['South Africa','South Africa','South Africa','South Africa','South Africa','South Africa','Japan','Japan'],
         'Product': ['ABC','ABC','ABC','ABC','XYZ','XYZ','DEF','DEF'],
         'Year': [2016, 2017, 2018, 2019,2016, 2017,2016, 2017],
         'Price': [200, 100, 30,750,350,120,400,370]}

df = pd.DataFrame(data1)
df2 = pd.DataFrame(data2)

df是完整的数据集,但有一些旧值,而df2只有更新的值.我想用df2中的值替换df中的所有值,同时保持不在df2中的值从df开始.

例如,在df中,Country=日本,Product=DEF,在Year=2016中,Price应该从470更新为400.2017年保持不变,2018年和2019年保持不变.

到目前为止,我有以下代码似乎不起作用:

common_index = ['Region','Country','Product','Year']
df = df.set_index(common_index)
df2 = df2.set_index(common_index)
df.update(df2, overwrite = True)

但这只会用df2的值更新df,并删除其他所有内容.

预期输出应如下所示:

data3 = {'Region': ['Africa','Africa','Africa','Africa','Africa','Africa','Africa','Africa','Asia','Asia','Asia','Asia'],
         'Country': ['South Africa','South Africa','South Africa','South Africa','South Africa','South Africa','South Africa','South Africa','Japan','Japan','Japan','Japan'],
         'Product': ['ABC','ABC','ABC','ABC','XYZ','XYZ','XYZ','XYZ','DEF','DEF','DEF','DEF'],
         'Year': [2016, 2017, 2018, 2019,2016, 2017, 2018, 2019,2016, 2017, 2018, 2019],
         'Price': [200, 100, 30,750,350,120,0,890,400,370,0,415]}

df3 = pd.DataFrame(data3)

有什么建议吗?

推荐答案

您可以使用mergeupdate:

df.update(df.merge(df2, on=['Region', 'Country', 'Product', 'Year'],
                   how='left', suffixes=('_old', None)))

NB. the 100 is 101.

输出:

    Region       Country Product  Year  Price
0   Africa  South Africa     ABC  2016  200.0
1   Africa  South Africa     ABC  2017  100.0
2   Africa  South Africa     ABC  2018   30.0
3   Africa  South Africa     ABC  2019  750.0
4   Africa  South Africa     XYZ  2016  350.0
5   Africa  South Africa     XYZ  2017  120.0
6   Africa  South Africa     XYZ  2018    0.0
7   Africa  South Africa     XYZ  2019  890.0
8     Asia         Japan     DEF  2016  400.0
9     Asia         Japan     DEF  2017  370.0
10    Asia         Japan     DEF  2018    0.0
11    Asia         Japan     DEF  2019  415.0

Python相关问答推荐

Python Hashicorp Vault库hvac创建新的秘密版本,但从先前版本中删除了密钥

如何让 turtle 通过点击和拖动来绘制?

pandas DataFrame GroupBy.diff函数的意外输出

如何比较numPy数组中的两个图像以获取它们不同的像素

当独立的网络调用不应该互相阻塞时,'

在np数组上实现无重叠的二维滑动窗口

我如何根据前一个连续数字改变一串数字?

不能使用Gekko方程'

Pandas GroupBy可以分成两个盒子吗?

无论输入分辨率如何,稳定扩散管道始终输出512 * 512张图像

LocaleError:模块keras._' tf_keras. keras没有属性__internal_'''

如何使用使用来自其他列的值的公式更新一个rabrame列?

OpenCV轮廓.很难找到给定图像的所需轮廓

在Python中从嵌套的for循环中获取插值

Django Table—如果项目是唯一的,则单行

如何获得3D点的平移和旋转,给定的点已经旋转?

修改.pdb文件中的值并另存为新的

根据过滤后的牛郎星图表中的数据计算新系列

多索引数据帧到标准索引DF

为什么在不先将包作为模块导入的情况下相对导入不起作用