簡體   English   中英

兩個多索引數據幀(一個具有多級列)上的完全外連接無法正常工作熊貓

[英]Full outer join on two multiindex dataframes (one with multi level columns) not working properly pandas

使用 Python 3.8,熊貓 1.1.2

我有兩個帶有多索引的日期框

df1(多級列):

                       user      price
                       count     sum
name    date    hour 
  A      9/17    1       33       34
  A      9/17    2       66       55
  A      9/17    3       77       2
  A      9/17    4       88       1
 

df2:

                       seller_count
name    date    hour 
  A      9/17    1        100 
  A      9/17    15        66 

我正在嘗試對其中兩個進行完全外部連接。

期望的輸出:

                       user      price
                       count     sum        seller_count
name    date    hour 
  A      9/17    1       33       34            100
  A      9/17    2       66       55            null
  A      9/17    3       77       2             null
  A      9/17    4       88       1             null
  A      9/17    15     Null     Null           66

我試圖找到一種方法來做到這一點而不重置索引。 有什么幫助嗎? 謝謝!

來自Pandas Dataframe Multiindex Merge 的解決方案似乎不起作用,如果它與 df1 具有相同的name, date,hour ,我只能獲得seller_count

df1.columns 輸出:

MultiIndex([(          'user',    'count'),
            (           'price',    'sum')])

df2.columns 輸出:

Index(["seller_count"])

設置

print (df1.index)
MultiIndex([('A', '9/17', 1),
            ('A', '9/17', 2),
            ('A', '9/17', 3),
            ('A', '9/17', 4)],
           names=['name', 'date', 'hour'])

print (df1.columns)
MultiIndex([( 'user', 'count'),
            ('price',   'sum')],
           )

print (df2.index)
MultiIndex([('A', '9/17',  1),
            ('A', '9/17', 15)],
           names=['name', 'date', 'hour'])

print (df2.columns)
Index(['seller_count'], dtype='object')

首先需要在df2創建MultiIndex ,然后使用合並與outer join

df2.columns = pd.MultiIndex.from_product([[''], df2.columns])

print (df2.columns)
MultiIndex([('', 'seller_count')],
           )

df = df1.merge(df2, left_index=True, right_index=True, how="outer")
print (df)
                user price             
               count   sum seller_count
name date hour                         
A    9/17 1     33.0  34.0        100.0
          2     66.0  55.0          NaN
          3     77.0   2.0          NaN
          4     88.0   1.0          NaN
          15     NaN   NaN         66.0

df = df1.join(df2, how="outer")
print (df)
                user price             
               count   sum seller_count
name date hour                         
A    9/17 1     33.0  34.0        100.0
          2     66.0  55.0          NaN
          3     77.0   2.0          NaN
          4     88.0   1.0          NaN
          15     NaN   NaN         66.0

print (df.columns)
MultiIndex([( 'user',        'count'),
            ('price',          'sum'),
            (     '', 'seller_count')],
           )


print (df.index)
MultiIndex([('A', '9/17',  1),
            ('A', '9/17',  2),
            ('A', '9/17',  3),
            ('A', '9/17',  4),
            ('A', '9/17', 15)],
           names=['name', 'date', 'hour'])

我假設df1中索引中的列名是“單級”。 您可以通過以下方式實現它:

  1. 源文件包含:

     name,date,hour,user,price , , ,count,sum A,9/17,1,33,34 A,9/17,2,66,55 A,9/17,3,77,2 A,9/17,4,88,1

    注意空格作為第二級的前 3 個列名。

  2. 讀取文件執行:

     df1 = pd.read_csv('Input_1.csv', header=[0,1]) df1 = df1.set_index([('name', ' '), ('date', ' '), ('hour', ' ')])\\ .rename_axis(index=['name', 'date', 'hour'])

這樣“2級”列名,設置為索引后,得到級名。

另一個需要注意的細節是:

  • 兩個 DataFrame 中的索引列名稱都是級的,
  • df1在列上有一個MultiIndex
  • df2在列上有一個普通(單級)索引,
  • 結果應該在列上有MultiIndex

要執行連接,您必須從向df2 中的列索引添加 MultiIndex 級別開始(以空格作為頂層):

df2.columns = pd.MultiIndex.from_product([[' '], df2.columns])

然后執行普通的外連接:

result = df1.join(df2, how='outer')

結果是:

                user price             
               count   sum seller_count
name date hour                         
A    9/17 1     33.0  34.0        100.0
          2     66.0  55.0          NaN
          3     77.0   2.0          NaN
          4     88.0   1.0          NaN
          15     NaN   NaN         66.0

暫無
暫無

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

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