两个多索引数据帧(其中一个具有多级列)上的完全外部联接无法正常工作panda



使用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中索引中的列名为";"单一级别";。您可以通过以下方式实现:

  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'])
    

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

最新更新