Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用非唯一索引合并多个数据帧_Python_Python 3.x_Join_Pandas_Merge - Fatal编程技术网

Python 使用非唯一索引合并多个数据帧

Python 使用非唯一索引合并多个数据帧,python,python-3.x,join,pandas,merge,Python,Python 3.x,Join,Pandas,Merge,给定两个具有非唯一索引和多维列的DFs: 人工鱼: 切赫: 此处为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, 我想加入/合并它们,有点像外部连接,这样就不会删除行 我希望输出为: arsenal arsenal arsenal

给定两个具有非唯一索引和多维列的DFs:

人工鱼:

切赫:

此处为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,

我想加入/合并它们,有点像外部连接,这样就不会删除行

我希望输出为:

            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
无法处理非唯一索引

你对如何实现这一目标有什么想法吗


注意:数据帧的长度不会相同。

您想使用
on='outer'
参数来连接
test1.csv
test2.csv
是您提供的文件):

这是我得到的结果:

           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

我已经设法用pandas的concat方法把它分类了

首先,我们需要添加一个多索引级别,使其变得唯一:

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
您需要使用:


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

Hi,thx用于输入。在本例中,它确实起作用,框架的长度是缩进的。然而,在我的例子中,这并不能保证。我尝试了不同行数的方法,结果似乎效果很好。
           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
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)
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
pd.merge(ars, che, left_index = True, right_index = True, how = 'outer')