2016-03-29 3 views
7

У меня есть следующие два dataframes, что я установить дату индекс df.set_index(pd.to_datetime(df['date']), inplace=True) DateTime и хотел бы объединить или присоединиться на дате:Панда: Объединить кадры данных по индексу даты и времени

df.head(5) 
     catcode_amt type feccandid_amt amount 
date     
1915-12-31 A5000 24K  H6TX08100 1000 
1916-12-31 T6100 24K  H8CA52052 500 
1954-12-31 H3100 24K  S8AK00090 1000 
1985-12-31 J7120 24E  H8OH18088 36 
1997-12-31 z9600 24K  S6ND00058 2000 


d.head(5) 
     catcode_disp disposition feccandid_disp bills 
date     
2007-12-31 A0000 support  S4HI00011    1 
2007-12-31 A1000 oppose  S4IA00020', 'P20000741 1 
2007-12-31 A1000 support  S8MT00010    1 
2007-12-31 A1500 support  S6WI00061    2 
2007-12-31 A1600 support  S4IA00020', 'P20000741 3 

Я попытался следующая два методы но оба возвращают MemoryError:

df.join(d, how='right') 

Я использую следующий код на dataframes, что не имеют даты установки индексировать.

merge=pd.merge(df,d, how='inner', on='date') 
+2

Ваша проблема заключается в том, что у вас есть повторяющиеся даты, поэтому комбинация повторяющихся строк представляет собой ng много дополнительных строк, поскольку нет сопоставления 1-1 – EdChum

+0

Спасибо EdChum! Я не заметил источник проблемы. Я решил удалить даты на 'd' и слить на' catcode' вместо этого. Он работает отлично! –

ответ

6

Вы можете добавить параметры left_index=True и right_index=True, если вам нужно объединить с помощью индексов в функции merge:

merge=pd.merge(df,d, how='inner', left_index=True, right_index=True) 

образца (первое значение индекса в d был изменен для соответствия):

print df 
      catcode_amt type feccandid_amt amount 
date            
1915-12-31  A5000 24K  H6TX08100 1000 
1916-12-31  T6100 24K  H8CA52052  500 
1954-12-31  H3100 24K  S8AK00090 1000 
1985-12-31  J7120 24E  H8OH18088  36 
1997-12-31  z9600 24K  S6ND00058 2000 

print d 
      catcode_disp disposition   feccandid_disp bills 
date                 
1997-12-31  A0000  support     S4HI00011 1.0 
2007-12-31  A1000  oppose S4IA00020', 'P20000741 1 NaN 
2007-12-31  A1000  support     S8MT00010 1.0 
2007-12-31  A1500  support     S6WI00061 2.0 
2007-12-31  A1600  support S4IA00020', 'P20000741 3 NaN 

merge=pd.merge(df,d, how='inner', left_index=True, right_index=True) 
print merge 
      catcode_amt type feccandid_amt amount catcode_disp disposition \ 
date                   
1997-12-31  z9600 24K  S6ND00058 2000  A0000  support 

      feccandid_disp bills 
date        
1997-12-31  S4HI00011 1.0 

Или вы можете использовать concat:

print pd.concat([df,d], join='inner', axis=1) 

date                   
1997-12-31  z9600 24K  S6ND00058 2000  A0000  support 

      feccandid_disp bills 
date        
1997-12-31  S4HI00011 1.0 

EDIT: EdChum прав:

добавить дубликаты DataFrame df (последние 2 значения в индексе):

print df 
      catcode_amt type feccandid_amt amount 
date            
1915-12-31  A5000 24K  H6TX08100 1000 
1916-12-31  T6100 24K  H8CA52052  500 
1954-12-31  H3100 24K  S8AK00090 1000 
2007-12-31  J7120 24E  H8OH18088  36 
2007-12-31  z9600 24K  S6ND00058 2000 

print d 
      catcode_disp disposition   feccandid_disp bills 
date                 
1997-12-31  A0000  support     S4HI00011 1.0 
2007-12-31  A1000  oppose S4IA00020', 'P20000741 1 NaN 
2007-12-31  A1000  support     S8MT00010 1.0 
2007-12-31  A1500  support     S6WI00061 2.0 
2007-12-31  A1600  support S4IA00020', 'P20000741 3 NaN 

merge=pd.merge(df,d, how='inner', left_index=True, right_index=True) 
print merge 
      catcode_amt type feccandid_amt amount catcode_disp disposition \ 
date                   
2007-12-31  J7120 24E  H8OH18088  36  A1000  oppose 
2007-12-31  J7120 24E  H8OH18088  36  A1000  support 
2007-12-31  J7120 24E  H8OH18088  36  A1500  support 
2007-12-31  J7120 24E  H8OH18088  36  A1600  support 
2007-12-31  z9600 24K  S6ND00058 2000  A1000  oppose 
2007-12-31  z9600 24K  S6ND00058 2000  A1000  support 
2007-12-31  z9600 24K  S6ND00058 2000  A1500  support 
2007-12-31  z9600 24K  S6ND00058 2000  A1600  support 

         feccandid_disp bills 
date           
2007-12-31 S4IA00020', 'P20000741 1 NaN 
2007-12-31     S8MT00010 1.0 
2007-12-31     S6WI00061 2.0 
2007-12-31 S4IA00020', 'P20000741 3 NaN 
2007-12-31 S4IA00020', 'P20000741 1 NaN 
2007-12-31     S8MT00010 1.0 
2007-12-31     S6WI00061 2.0 
2007-12-31 S4IA00020', 'P20000741 3 NaN 
+0

@ jezrael: Я просто попробовал код, который вы рекомендовали: я все еще получаю MemoryError. У тебя есть другие идеи? –

+1

Каков размер вашей 'RAM'? Какова форма ваших DataFrames? 'print df.shape' и' print d.shape'? – jezrael

+0

My 'df.shape'' (389194, 4) 'и мой' d.shape is (2910, 4) ' –

2

Похож дата ваши показатели, в этом случае вы хотели бы объединить по индексу, а не колонки. Если у вас есть два dataframes, df_1 и df_2:

df_1.merge(df_2, left_index=True, right_index=True, how='inner')

+0

Спасибо за ваше предложение. Я просто попробовал, и все еще получаю MemoryError. У тебя есть другие идеи? –

+0

попробуйте с двумя файлами данных, которые являются небольшим подмножеством ваших данных - скажем, последние 100 строк каждого. – dmb

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