python - 基于 Python 中另一个数据帧的多列合并和填充缺失值

标签 python pandas dataframe

为了合并基于 yearcity 的两个数据框,我想填充 df1 gdp_value 中缺失的值code> 和 growth_rate 分别来自 df2gdprate 值。

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()

最佳答案

正如问题中提到的,您还可以根据您的数据和需求使用更新:

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()

一种方法是将 combine_firstset_index 和列重命名结合使用:

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

关于python - 基于 Python 中另一个数据帧的多列合并和填充缺失值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58636416/

相关文章:

python - Django Auth LDAP - 使用 sAMAccountName 直接绑定(bind)

python - 如何将合并的 Excel 单元格与 NaN 读入 Pandas DataFrame

python - 如何在 Python DataFrame 中的确定行之前添加空行?

python - 使用字典重新索引 pandas DataFrame (python3)

python - 如何获取数据框列字符串中每个单词的第一个字母

r - 汇总数据框中的分组记录

python - 为什么在 Ubuntu 上安装 Pillow 3.0.0 时出现错误?

python - 订阅 Microsoft Office 365 管理事件 API : Authorization denied

python - QValidator.fixup() 在 PySide 中如何工作?

python - 处理 block 数据时如何 pd.merge(..., on ="column", ...) ?