Merging multiple dataframes with non unique indexes
You want to use the on='outer'
argument for join
(test1.csv
and test2.csv
are the files you gave):
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')
This is the result I get:
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
I've managed to sort it out using pandas' concat
method.
First, we need to add a Multiindex level so that it becomes unique:
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)
Now we can use 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)
Output:
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