亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

將兩個數據框與分層列合并

將兩個數據框與分層列合并

拉莫斯之舞 2023-09-05 20:57:02
這是我第一次在 pandas 中使用多重索引,我需要一些幫助來合并兩個具有分層列的數據幀。這是我的兩個數據框:col_index = pd.MultiIndex.from_product([['a', 'b', 'c'], ['w', 'x']])df1 = pd.DataFrame(np.ones([4,6]),columns=col_index, index=range(4))     a         b         c          w    x    w    x    w    x0  1.0  1.0  1.0  1.0  1.0  1.01  1.0  1.0  1.0  1.0  1.0  1.02  1.0  1.0  1.0  1.0  1.0  1.03  1.0  1.0  1.0  1.0  1.0  1.0df2 = pd.DataFrame(np.zeros([2,6]),columns=col_index, index=range(2))     a         b         c          w    x    w    x    w    x0  0.0  0.0  0.0  0.0  0.0  0.01  0.0  0.0  0.0  0.0  0.0  0.0當我使用合并方法時,我得到以下結果:pd.merge(df1,df2, how='left', suffixes=('', '_2'), left_index = True, right_index= True ))     a         b         c       a_2       b_2       c_2          w    x    w    x    w    x    w    x    w    x    w    x0  1.0  1.0  1.0  1.0  1.0  1.0  0.0  0.0  0.0  0.0  0.0  0.01  1.0  1.0  1.0  1.0  1.0  1.0  0.0  0.0  0.0  0.0  0.0  0.02  1.0  1.0  1.0  1.0  1.0  1.0  NaN  NaN  NaN  NaN  NaN  NaN3  1.0  1.0  1.0  1.0  1.0  1.0  NaN  NaN  NaN  NaN  NaN  NaN但我想在較低級別上合并兩個數據幀,后綴對 ['w', 'x'] 生效,如下所示:     a                   b                   c                    w  w_2    x  x_2    w  w_2    x  x_2    w  w_2    x  x_20  1.0  0.0  1.0  0.0  1.0  0.0  1.0  0.0  1.0  0.0  1.0  0.01  1.0  0.0  1.0  0.0  1.0  0.0  1.0  0.0  1.0  0.0  1.0  0.02  1.0  NaN  1.0  NaN  1.0  NaN  1.0  NaN  1.0  NaN  1.0  NaN3  1.0  NaN  1.0  NaN  1.0  NaN  1.0  NaN  1.0  NaN  1.0  NaN
查看完整描述

1 回答

?
忽然笑

TA貢獻1806條經驗 獲得超5個贊

您可以將joinormergeswaplevel()or 一起使用reorder_levels。然后使用.sort_index()和 傳遞axis=1來按索引列排序。

  • .join()當您像這樣對索引進行合并時會更好。

  • .swaplevel()當有兩個級別時更好(如本例),而當.reorder_levels()有 3 個或更多級別時更好。

以下是這些方法的 4 種組合。對于這個具體的例子,我認為.join()/.swaplevel()是最簡單的(參見最后一個例子):

df3 = (df1.reorder_levels([1,0],axis=1)

       .join(df2.reorder_levels([1,0],axis=1), rsuffix='_2')

       .reorder_levels([1,0],axis=1).sort_index(axis=1, level=[0, 1]))

df3

Out[1]: 

     a                   b                   c               

     w  w_2    x  x_2    w  w_2    x  x_2    w  w_2    x  x_2

0  1.0  0.0  1.0  0.0  1.0  0.0  1.0  0.0  1.0  0.0  1.0  0.0

1  1.0  0.0  1.0  0.0  1.0  0.0  1.0  0.0  1.0  0.0  1.0  0.0

2  1.0  NaN  1.0  NaN  1.0  NaN  1.0  NaN  1.0  NaN  1.0  NaN

3  1.0  NaN  1.0  NaN  1.0  NaN  1.0  NaN  1.0  NaN  1.0  NaN


df3 = (pd.merge(df1.reorder_levels([1,0],axis=1),

                df2.reorder_levels([1,0],axis=1),

                how='left', left_index=True, right_index=True, suffixes = ('', '_2'))

                .reorder_levels([1,0],axis=1).sort_index(axis=1, level=[0, 1]))

df3

Out[2]: 

     a                   b                   c               

     w  w_2    x  x_2    w  w_2    x  x_2    w  w_2    x  x_2

0  1.0  0.0  1.0  0.0  1.0  0.0  1.0  0.0  1.0  0.0  1.0  0.0

1  1.0  0.0  1.0  0.0  1.0  0.0  1.0  0.0  1.0  0.0  1.0  0.0

2  1.0  NaN  1.0  NaN  1.0  NaN  1.0  NaN  1.0  NaN  1.0  NaN

3  1.0  NaN  1.0  NaN  1.0  NaN  1.0  NaN  1.0  NaN  1.0  NaN


df3 = (pd.merge(df1.swaplevel(axis=1),

                df2.swaplevel(axis=1),

                how='left', left_index=True, right_index=True, suffixes = ('', '_2'))

                .swaplevel(axis=1).sort_index(axis=1, level=[0, 1]))

df3

Out[3]: 

     a                   b                   c               

     w  w_2    x  x_2    w  w_2    x  x_2    w  w_2    x  x_2

0  1.0  0.0  1.0  0.0  1.0  0.0  1.0  0.0  1.0  0.0  1.0  0.0

1  1.0  0.0  1.0  0.0  1.0  0.0  1.0  0.0  1.0  0.0  1.0  0.0

2  1.0  NaN  1.0  NaN  1.0  NaN  1.0  NaN  1.0  NaN  1.0  NaN

3  1.0  NaN  1.0  NaN  1.0  NaN  1.0  NaN  1.0  NaN  1.0  NaN


df3 = (df1.swaplevel(i=0,j=1, axis=1)

       .join(df2.swaplevel(axis=1), rsuffix='_2')

       .swaplevel(axis=1).sort_index(axis=1, level=[0, 1]))

df3

Out[4]: 

     a                   b                   c               

     w  w_2    x  x_2    w  w_2    x  x_2    w  w_2    x  x_2

0  1.0  0.0  1.0  0.0  1.0  0.0  1.0  0.0  1.0  0.0  1.0  0.0

1  1.0  0.0  1.0  0.0  1.0  0.0  1.0  0.0  1.0  0.0  1.0  0.0

2  1.0  NaN  1.0  NaN  1.0  NaN  1.0  NaN  1.0  NaN  1.0  NaN

3  1.0  NaN  1.0  NaN  1.0  NaN  1.0  NaN  1.0  NaN  1.0  NaN


查看完整回答
反對 回復 2023-09-05
  • 1 回答
  • 0 關注
  • 128 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號