Python Pandas - 通过将标签与列匹配,将值从一个数据框添加到另一个数据框

bca*_*cal 5 python dataframe pandas

我知道这个问题有一个简单,优雅的解决方案,但我很难找到它.我要做的就是根据日期和PN,将第三列添加到df2,并使用df2中的相应值.df2中的值可能与df1不匹配,反之亦然(填充NaN,其中没有匹配).

DF1:

       2017-11-01  2017-11-02  2017-11-03
PN                                                                              
90020       105.0       105.0       105.0
90022       100.0       100.0       100.0 
90061        -3.0        -3.0        -3.0 
90065        30.0        30.0        30.0
90099         2.0         2.0         2.0
Run Code Online (Sandbox Code Playgroud)

DF2:

     PN       Date
4   90020 2017-11-01
9   90020 2017-11-02
12  90061 2017-11-01
13  90065 2017-11-02
17  94008 2017-11-03
Run Code Online (Sandbox Code Playgroud)

期望的结果:

     PN       Date      Value
4   90020 2017-11-01    105.0
9   90020 2017-11-02    105.0
12  90061 2017-11-01    -3.0
13  90065 2017-11-02    30.0
17  94008 2017-11-03    NaN
Run Code Online (Sandbox Code Playgroud)

jpp*_*jpp 4

如前所述,您可以pd.melt与 结合使用pd.merge

只需记住reset_index将索引提升为列,然后对齐列名称即可。

df1 = pd.melt(df.reset_index(), id_vars=df.index.name)\
        .rename(columns={'variable': 'Date'})

res = pd.merge(df2, df1, how='left')

#       PN        Date  value
# 0  90020  2017-11-01  105.0
# 1  90020  2017-11-02  105.0
# 2  90061  2017-11-01   -3.0
# 3  90065  2017-11-02   30.0
# 4  94008  2017-11-03    NaN
Run Code Online (Sandbox Code Playgroud)

维护df2索引:

res = df2.reset_index()\
         .merge(df1, how='left')\
         .set_index('index')

#           PN        Date  value
# index                          
# 4      90020  2017-11-01  105.0
# 9      90020  2017-11-02  105.0
# 12     90061  2017-11-01   -3.0
# 13     90065  2017-11-02   30.0
# 17     94008  2017-11-03    NaN
Run Code Online (Sandbox Code Playgroud)