合并具有非唯一索引的多个数据帧
Posted
技术标签:
【中文标题】合并具有非唯一索引的多个数据帧【英文标题】:Merging multiple dataframes with non unique indexes 【发布时间】:2015-06-21 18:19:58 【问题描述】:给定两个具有非唯一索引和多维列的 DF:
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
切:
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
。合并的外连接提供了一个点积,这不是我想要的,而concat
无法处理非唯一索引。
您对如何实现这一点有任何想法吗?
注意:数据帧的长度不会相同。
【问题讨论】:
【参考方案1】:你需要使用pandas.merge:
pd.merge(ars, che, left_index = True, right_index = True, how = 'outer')
它可以处理非唯一索引和不同大小的数据帧。
【讨论】:
谢谢!我将左右索引参数设置为 True 并得到了我需要的结果。【参考方案2】:我已经设法使用 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】:您想为join
使用on='outer'
参数(test1.csv
和test2.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
【讨论】:
嗨,谢谢输入。它在这个例子中确实有效,其中帧的长度是缩进的。但是,在我的情况下并不能保证。 我尝试了不同的行数,它似乎工作正常。以上是关于合并具有非唯一索引的多个数据帧的主要内容,如果未能解决你的问题,请参考以下文章