在跳过不匹配时,在行和列索引上合并2个多维数据帧

时间:2016-12-20 12:43:17

标签: python pandas dataframe merge

我必须使用不同大小的多维数据帧

import pandas as pd
import numpy as np

default_entries = ['VOD','APPL','MSFT','PGO']
join_entries    = ['VOD','MSFT','PGO']

df_join = pd.DataFrame([[1,2,3],[4,5,6],[7,8,9]],index=join_entries, columns=join_entries)
df_default = pd.DataFrame(np.zeros((4,4)),index=default_entries, columns=default_entries)

这给了我这个

     VOD   MSFT   PGO
VOD   1     2      3
MSFT  4     5      6
PGO   7     8      9

     VOD   APPL   MSFT   PGO
VOD   0      0     0      0
APPL  0      0     0      0
MSFT  0      0     0      0
PGO   0      0     0      0

我现在想将两个帧合并为一个看起来像这个

的新帧
     VOD    APPL   MSFT   PGO
VOD   1       0      2     3
APPL  0       0      0     0
MSFT  4       0      5     6
PGO   7       0      8     9

我基本上希望我的默认df能够填充连接df中缺少的值,原因是在保留元素顺序的同时重新缩放数据帧。

我试过

pd.merge(default_entries, join_entries, on = default_entries.index, how='outer')

但它似乎不喜欢尺寸。如果有人知道一个更优雅的解决方案,而不是建立一个很棒的循环。

1 个答案:

答案 0 :(得分:1)

您可以使用:

df_default.add(df_join)

output:
      APPL  MSFT  PGO  VOD
APPL   NaN   NaN  NaN  NaN
MSFT   NaN   5.0  6.0  4.0
PGO    NaN   8.0  9.0  7.0
VOD    NaN   2.0  3.0  1.0

处理订单:

new_df = df_default.add(df_join, fill_value = 0)
new_df = new_df[df_default.columns.tolist()]
new_df = new_df.reindex(index=df_default.columns.tolist())
print new_df
      VOD  APPL  MSFT  PGO
VOD   1.0   0.0   2.0  3.0
APPL  0.0   0.0   0.0  0.0
MSFT  4.0   0.0   5.0  6.0
PGO   7.0   0.0   8.0  9.0

由@Ted Petrou提供,在.add语句中使用fill_value = 0.将NaN值填充为0。