[英]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中索引中的列名是“單級”。 您可以通過以下方式實現它:
源文件包含:
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 個列名。
讀取文件執行:
df1 = pd.read_csv('Input_1.csv', header=[0,1]) df1 = df1.set_index([('name', ' '), ('date', ' '), ('hour', ' ')])\\ .rename_axis(index=['name', 'date', 'hour'])
這樣“2級”列名,設置為索引后,得到單級名。
另一個需要注意的細節是:
要執行連接,您必須從向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.