2015-04-15 4 views
5

Учитывая два ДФХ с не уникальными индексами и многомерных столбцов:Объединение нескольких dataframes с не уникальными индексами

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 

Ни один из панд инструментов, которые я знаю, не работал: merge, join, concat. Внешнее соединение merge дает точечный продукт, который не является тем, что я ищу, а concat не может обрабатывать уникальные индексы.

Есть ли у вас идеи, как это можно достичь?

Примечание: длина информационных кадров не будет идентификационной.

ответ

1

мне удалось сортировать его с помощью 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 
2

Вы хотите использовать on='outer' аргумент для join (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 
+0

Привет, ТНХ для ввода. Он работал в этом примере, где длина кадров была обязательной. Однако в моем случае это не гарантируется. –

+0

Я пробовал его с разным количеством рядов, и он работал нормально. – TheBlackCat

Смежные вопросы