基于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
中的值中填充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 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。。。。这不应该发生。你能用显示这种行为的数据集开始一个新问题吗?