簡體   English   中英

如何從參考數據幀在多索引數據幀中插入新行

[英]How to insert new rows in a multi index dataframe from a reference dataframe

我已經看過幾篇關於這個的帖子,但我無法理解如何使用另一個數據幀進行合並、連接和連接。 如何參考另一個數據幀 d2 填充初始 df1 [多索引數據幀]。 並填寫每個級別的 df1 中不存在的所有行。

df1

date      dispatch_no  A   B   C
2019-12-2   1          a1  b1  c1
            2          a2  b2  c2
            5          a5  b5  c5
2019-12-2   1          d1  e1  f1
            3          d3  e3  f3

參考數據幀 d2

dispatch_no  M   N   O  
1            M1  N1  O1
2            M2  N2  O2
3            M3  N3  O3             
4            M4  N4  O4
5            M5  N5  O5

預期產出

date      dispatch_no  A   B   C
2019-12-2   1          a1  b1  c1
            2          a2  b2  c2
            3          M3  N3  O3  
            4          M4  N4  O4
            5          a5  b5  c5
2019-12-2   1          d1  e1  f1
            2          M2  N2  O2
            3          d3  e3  f3
            4          M4  N4  O4
            5          M5  N5  O5

用:

df1_unstack=df1.unstack('date')
new_df=( df1_unstack.reindex(index=list(range(df1_unstack.index.min(),
                                     df1_unstack.index.max()+1)))
           .stack(dropna=False)
           .swaplevel()
           .sort_index())

df_fill=df2.set_index('dispatch_no')
df_fill.columns=new_df.columns
new_df=new_df.fillna(df_fill)

print(new_df)


                        A   B   C
date      dispatch_no            
2019-12-2 1            a1  b1  c1
          2            a2  b2  c2
          3            M3  N3  O3
          4            M4  N4  O4
          5            a5  b5  c5
2019-12-3 1            d1  e1  f1
          2            M2  N2  O2
          3            d3  e3  f3
          4            M4  N4  O4
          5            M5  N5  O5

數據幀

print(df1)

                        A   B   C
date      dispatch_no            
2019-12-2 1            a1  b1  c1
          2            a2  b2  c2
          5            a5  b5  c5
2019-12-3 1            d1  e1  f1
          3            d3  e3  f3

print(df2)
   dispatch_no   M   N   O
0            1  M1  N1  O1
1            2  M2  N2  O2
2            3  M3  N3  O3
3            4  M4  N4  O4
4            5  M5  N5  O5

根據@ansev 提供的上述數據,這是另一種方式(如果dispatch_no不是索引,則使用df2=df2.set_index('dispatch_no') ):

c=df1.index.get_level_values(0).unique()      #['2019-12-2', '2019-12-3']
m=pd.concat([df2]*len(c))                     #multiply the df to the length of c
idx=pd.MultiIndex.from_product([c,df2.index]) #create a multiindex
m.index=idx                                   #assign to m and finally reindex

然后使用combine_first()

final=df1.reindex(idx).combine_first(m.rename(columns=dict(zip(m.columns,df1.columns))))

              A   B   C
2019-12-2 1  a1  b1  c1
          2  a2  b2  c2
          3  M3  N3  O3
          4  M4  N4  O4
          5  a5  b5  c5
2019-12-3 1  d1  e1  f1
          2  M2  N2  O2
          3  d3  e3  f3
          4  M4  N4  O4
          5  M5  N5  O5

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM