Pandas:在日期时间索引上合并数据帧

39

我有以下两个数据框,已将日期设置为DatetimeIndex df.set_index(pd.to_datetime(df['date']), inplace=True),并想在日期上合并或连接:

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')

我在没有日期索引的数据框中使用以下代码。

merge=pd.merge(df,d, how='inner', on='date')
3个回答

45

在函数merge中,如果您需要按索引合并,请添加参数left_index=Trueright_index=True

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  

编辑: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  

@ jezrael: 我刚刚尝试了你推荐的代码:我仍然遇到了MemoryError,你还有其他想法吗? - Collective Action
1
你的 RAM 大小是多少? 你的数据帧的形状是什么?请输出 df.shaped.shape - jezrael
我的 df.shape(389194, 4),而我的 d.shape(2910, 4) - Collective Action
1
嗯,也许可以看一下我回答的编辑部分,帮助函数concat - jezrael

7

看起来你的日期是索引,因此你需要按照索引合并,而不是按列。如果你有两个数据框:df_1df_2:

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


谢谢您的建议。我刚刚尝试了,但仍然遇到了 MemoryError 的问题。您有其他的想法吗? - Collective Action
尝试使用两个数据框架,它们是您数据的一个小子集 - 比如每个数据框架的最后100行。 - dmb

2

我遇到了类似的问题。你很可能有很多NaT
我删除了所有的NaT,然后执行了连接操作,就成功地将它们连接在了一起。

df = df[df['date'].notnull() == True].set_index('date')
d = d[d['date'].notnull() == True].set_index('date')
df.join(d, how='right')

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接