合并具有非唯一索引的多个数据框

6
给定两个具有非唯一索引和多维列的数据框:
ars:
           arsenal   arsenal   arsenal   arsenal
NaN             B3        SK        BX        BY
2015-04-15     NaN       NaN       NaN      26.0
2015-04-14     NaN       NaN       NaN       NaN
2015-04-13    26.0      26.0      23.0       NaN
2015-04-13    22.0      21.0      19.0       NaN

che:

           chelsea   chelsea   chelsea   chelsea
NaN             B3        SK        BX        BY
2015-04-15     NaN       NaN       NaN      1.01
2015-04-14    1.02       NaN       NaN       NaN
2015-04-14     NaN      1.05       NaN       NaN

这里提供CSV格式的文件

,arsenal,arsenal,arsenal,arsenal
,B3,SK,BX,BY
2015-04-15,,,,26.0
2015-04-14,,,,
2015-04-13,26.0,26.0,23.0,
2015-04-13,22.0,21.0,19.0,

,chelsea,chelsea,chelsea,chelsea
,B3,SK,BX,BY
2015-04-15,,,,1.01
2015-04-14,1.02,,,
2015-04-14,,1.05,,

我希望将它们合并,类似于外连接的方式,这样行就不会被删除。
我希望输出结果为:
            arsenal  arsenal   arsenal   arsenal chelsea   chelsea   chelsea   chelsea
NaN             B3        SK        BX        BY      B3        SK        BX        BY
2015-04-15     NaN       NaN       NaN      26.0     NaN       NaN       NaN      1.01
2015-04-14     NaN       NaN       NaN       NaN    1.02       NaN       NaN       NaN
2015-04-14     NaN       NaN       NaN       NaN     NaN      1.05       NaN       NaN
2015-04-13    26.0      26.0      23.0       NaN     NaN       NaN       NaN       NaN
2015-04-13    22.0      21.0      19.0       NaN     NaN       NaN       NaN       NaN

我所知道的pandas工具都无法胜任: merge, join, concat。merge的外连接提供的是点积,而不是我所需要的,而concat无法处理非唯一索引。

你有任何想法如何实现这个目标吗?

备注:数据帧长度并不相同。

3个回答

3

您想在使用join时为on='outer'参数(您提供的文件是test1.csvtest2.csv):

df1 = pd.read_csv('test1.csv', index_col=0, header=[0,1])
df2 = pd.read_csv('test2.csv', index_col=0, header=[0,1])

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

这是我得到的结果:
           arsenal             chelsea  
                B3  SK  BX  BY      B3    SK  BX    BY
2015-04-13      26  26  23 NaN     NaN   NaN NaN   NaN
2015-04-14     NaN NaN NaN NaN    1.02   NaN NaN   NaN
2015-04-14     NaN NaN NaN NaN     NaN  1.05 NaN   NaN
2015-04-15     NaN NaN NaN  26     NaN   NaN NaN  1.01

嗨,谢谢您的输入。在这个例子中它确实有效,因为帧的长度是相同的。然而,在我的情况下不能保证。 - Bartek R.
1
我尝试了不同行数的数据,看起来都能正常工作。 - TheBlackCat

3

我使用 pandas 的 concat 方法解决了这个问题。

首先,我们需要添加一个 Multiindex 级别,以使其成为唯一的:

ars = pd.read_csv("ars.csv", index_col=[0], header=[0,1])
che = pd.read_csv("che.csv", index_col=[0], header=[0,1])

ars.index.name = "date"
ars["num"] = range(0, len(ars.index))
ars = ars.set_index("num", append=True)

che.index.name = "date"
che["num"] = range(0, len(che.index))
che = che.set_index("num", append=True)

现在我们可以使用concat:
df = pd.concat([ars, che], axis=1)
df = df.reset_index()
df = df.sort_index(by=["date", "num"], ascending=[False, True])
df = df.set_index(["date", "num"])
df.index = df.index.droplevel(1)

输出:

                arsenal             chelsea                
                B3  SK  BX  BY      B3    SK  BX    BY
date                                                  
2015-04-15     NaN NaN NaN  26     NaN   NaN NaN  1.01
2015-04-14     NaN NaN NaN NaN    1.02   NaN NaN   NaN
2015-04-14     NaN NaN NaN NaN     NaN  1.05 NaN   NaN
2015-04-13      26  26  23 NaN     NaN   NaN NaN   NaN
2015-04-13      22  21  19 NaN     NaN   NaN NaN   NaN

3
您需要使用 pandas.merge
pd.merge(ars, che, left_index = True, right_index = True, how = 'outer')

它可以处理非唯一索引和数据框的不同大小。


谢谢!我将左右索引参数设置为True,并获得了所需的结果。 - PigSpider

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接