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)
如前所述,您可以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)