基于Python中另一个数据帧中的多个列合并并填充缺少的值

基于Python中另一个数据帧中的多个列合并并填充缺少的值,python,pandas,dataframe,Python,Pandas,Dataframe,为了合并基于year和city的两个数据帧,我想分别从df2的gdp和rate中的值中填充df1gdp值和growth\u率中缺失的值 df1 year city gdp_value growth_rate 0 2015 sh NaN NaN 1 2016 sh NaN NaN 2 2017 sh NaN NaN 3 2018 sh NaN

为了合并基于
year
city
的两个数据帧,我想分别从df2
gdp
rate
中的值中填充df1
gdp值和
growth\u率
中缺失的值

df1

   year city  gdp_value  growth_rate
0  2015   sh        NaN          NaN
1  2016   sh        NaN          NaN
2  2017   sh        NaN          NaN
3  2018   sh        NaN          NaN
4  2019   sh        NaN          NaN
5  2015   bj        7.0         0.01
6  2016   bj        3.0         0.03
7  2017   bj        2.0        -0.03
8  2018   bj        5.0         0.05
9  2019   bj        4.0         0.02
df2

   year city  gdp  rate
0  2015   sh    6  0.04
1  2016   sh    5  0.07
2  2017   sh    3 -0.03
3  2018   sh    6  0.05
4  2019   sh    4  0.02
我试过使用
pd.merge(df1,df2,on=['year','city','how='left')
,我得到了:

   year city  gdp_value  growth_rate  gdp  rate
0  2015   sh        NaN          NaN  6.0  0.04
1  2016   sh        NaN          NaN  5.0  0.07
2  2017   sh        NaN          NaN  3.0 -0.03
3  2018   sh        NaN          NaN  6.0  0.05
4  2019   sh        NaN          NaN  4.0  0.02
5  2015   bj        7.0         0.01  NaN   NaN
6  2016   bj        3.0         0.03  NaN   NaN
7  2017   bj        2.0        -0.03  NaN   NaN
8  2018   bj        5.0         0.05  NaN   NaN
9  2019   bj        4.0         0.02  NaN   NaN
我想要的输出df如下:

   year city  gdp_value  ratio_rate
0  2015   sh          6        0.04
1  2016   sh          5        0.07
2  2017   sh          3       -0.03
3  2018   sh          6        0.05
4  2019   sh          4        0.02
5  2015   bj          7        0.01
6  2016   bj          3        0.03
7  2017   bj          2       -0.03
8  2018   bj          5        0.05
9  2019   bj          4        0.02
谢谢你的帮助

已编辑,此解决方案似乎可行,谢谢:

df1 = df1.set_index(['year', 'city'])
df1.update(
    df2
    .set_index(['year', 'city'])\
    .rename(columns={'gdp':'gdp_value','rate':'growth_rate'})\
)
df1 = df1.reset_index()

如问题中所述,您还可以根据您的数据和需要使用update:

df1 = df1.set_index(['year', 'city'])
df1.update(
    df2
    .set_index(['year', 'city'])\
    .rename(columns={'gdp':'gdp_value','rate':'growth_rate'})\
)
df1 = df1.reset_index()

一种方法是使用
将_first
设置_索引
和列重命名相结合:

df1.set_index(['year','city'])\
   .combine_first(df2.set_index(['year','city'])
                     .rename(columns={'gdp':'gdp_value','rate':'growth_rate'}))\
   .reset_index()
输出:

   year city  gdp_value  growth_rate
0  2015   bj        7.0         0.01
1  2015   sh        6.0         0.04
2  2016   bj        3.0         0.03
3  2016   sh        5.0         0.07
4  2017   bj        2.0        -0.03
5  2017   sh        3.0        -0.03
6  2018   bj        5.0         0.05
7  2018   sh        6.0         0.05
8  2019   bj        4.0         0.02
9  2019   sh        4.0         0.02

有很多方法可以解决这个问题,但是关键是设置索引并重命名列以匹配每个数据帧。pandas几乎所有的操作都使用索引对齐。很快,我得到了
TypeError:无法将type Period与type str
与实际数据进行比较。您需要使每个列的数据类型也匹配。您有一个数据帧数据类型时间段和另一个字符串。另一个问题是,
df1
中的一些其他列值在
combine\u first
之后变为
NaN
s。。。。这不应该发生。你能用显示这种行为的数据集开始一个新问题吗?