【问题标题】:Pandas: Merge data frames on datetime indexPandas:在日期时间索引上合并数据框
【发布时间】:2022-04-14 17:38:48
【问题描述】:

我有以下两个数据框,我已将日期设置为 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')

【问题讨论】:

    标签: python pandas merge datetimeindex


    【解决方案1】:

    如果需要在函数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。您还有其他想法吗?
    • 您的RAM 的大小是多少?您的 DataFrame 的形状是什么? print df.shapeprint d.shape ?
    • 我的df.shape (389194, 4) 和我的d.shape is (2910, 4)
    • 嗯,也许是帮助功能concat,请参阅我的答案的编辑。
    【解决方案2】:

    看起来您的日期是您的索引,在这种情况下,您希望合并索引,而不是列。如果您有两个数据框,df_1df_2

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

    【讨论】:

    • 感谢您的建议。我刚刚尝试过,但仍然出现 MemoryError。您还有其他想法吗?
    • 尝试使用两个数据框,它们是您数据的一小部分 - 比如说每个数据框的最后 100 行。
    【解决方案3】:

    我遇到了类似的问题。你很可能有很多NaTs。
    我删除了我所有的NaTs,然后执行了加入并能够加入。

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

    【讨论】:

      猜你喜欢
      • 2019-03-16
      • 2021-11-29
      • 2020-12-02
      • 1970-01-01
      • 1970-01-01
      • 2021-08-14
      • 2018-07-31
      • 1970-01-01
      • 2021-05-20
      相关资源
      最近更新 更多