基于使用PandasMap的Excel工作表的棘手填充字段

0md85ypi  于 2023-04-28  发布在  其他
关注(0)|答案(1)|浏览(75)

我有一个df,df1,基于绑定,年份和状态,如果年份,qtr,状态绑定和类型匹配,我想用df2的值填充另一个df,df3。我正在考虑使用Pandas和OpenPyXL的组合,但仍在研究这个。

数据

df1

year    state   bound
2027    CA      low_stat
2027    CA      low_re
2027    NY      med_stat
2027    NY      med_re

df2

year    qtr    state type   low_stat low_re med_stat med_re high_stat   high_re
2027    2027Q1  NY   AA     5        6      0        1      3           4
2027    2027Q1  CA   AA     1        4      5        4      1           4
2027    2027Q2  NY   AA     3        6      4        16     56          1
2027    2027Q2  CA   AA     11       2      3        2      3           2
2027    2027Q1  NY   BB     1        2      3        4      3           2
2027    2027Q1  CA   BB     9        3      2        2      3           2
2027    2027Q2  NY   BB     3        1      4        1      5           6
2027    2027Q2  CA   BB     9        5      2        5      3           2

DF3

year    state    qtr      low_stat_AA low_re_AA low_stat_BB low_re_BB med_stat_AA med_re_AA med_stat_BB med_re_BB
2027    CA       2027Q1                             
2027    CA       2027Q2                             
2027    NY       2027Q1                             
2027    NY       2027Q2

期望

year    state   qtr     low_stat_AA low_re_AA low_stat_BB low_re_BB med_stat_AA med_re_AA   med_stat_BB med_re_BB
2027    CA      2027Q1  1           4         9           3             
2027    CA      2027Q2  11          2         9           5             
2027    NY      2027Q1                                              0           1            3          4
2027    NY      2027Q2                                              4           16           4          1

merged = pd.merge(df2,df3, on = 'year','state','type')

我也许可以使用合并。但是,我仍然在研究,因为这是不具体的。任何建议都表示赞赏。

aiqt4smr

aiqt4smr1#

步骤1

熔化df2并与df1合并

df_merge = df1.merge(df2.melt(['year', 'qtr', 'state', 'type'], var_name='bound'))

df_merge.head(5)

year    state   bound       qtr     type    value
0   2027    CA      low_stat    2027Q1  AA      1
1   2027    CA      low_stat    2027Q2  AA      11
2   2027    CA      low_stat    2027Q1  BB      9
3   2027    CA      low_stat    2027Q2  BB      9
4   2027    CA      low_re      2027Q1  AA      4

第二步

使用df_merge创建pivot_table。bound列和type列中的字符串必须用'_'连接,因此让我们使用www.example.com函数创建grouperstr.cat。

grouper = df_merge['bound'].str.cat(df_merge['type'], sep='_')
out = (df_merge
       .pivot_table('value', index=['year', 'state', 'qtr'], columns=grouper)
       .reset_index())

out

bound   year    state   qtr     low_re_AA   low_re_BB   low_stat_AA low_stat_BB med_re_AA   med_re_BB   med_stat_AA med_stat_BB
0       2027    CA      2027Q1  4.0         3.0         1.0         9.0         NaN         NaN         NaN         NaN
1       2027    CA      2027Q2  2.0         5.0         11.0        9.0         NaN         NaN         NaN         NaN
2       2027    NY      2027Q1  NaN         NaN         NaN         NaN         1.0         4.0         0.0         3.0
3       2027    NY      2027Q2  NaN         NaN         NaN         NaN         16.0        1.0         4.0         4.0

如果你想要和df3一样的排序,你可以使用df3.columnsreindex它。

out.reindex(columns=df3.columns)

相关问题