使用Python 3.8、pandas 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多索引合并的解决方案似乎不起作用,只有当它具有与df1相同的name, date,hour
时,我才能获得seller_count
。
df1.列输出:
MultiIndex([( 'user', 'count'),
( 'price', 'sum')])
df2.列输出:
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
:一起使用merge
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'])
This way";2级";列名,设置为索引后,获得单个级别名称。
另一个需要注意的细节是:
两个DataFrames中的- 索引列名都是单个级别
- df1在列上具有MultiIndex
- df2在列上具有普通(单级(索引
- 结果应该在列上具有MultiIndex
要执行联接,必须从添加MultiIndex级别开始到df2中的列索引(以空格作为顶层(:
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