【问题标题】:Python Pandas - Issue appending / concat two multi-indexed DataframesPython Pandas - 问题附加/连接两个多索引数据帧
【发布时间】:2023-03-25 12:36:01
【问题描述】:

我正在尝试合并两个 MultiIndex 的数据框。我的代码如下。正如您在输出中看到的那样,问题是重复“DATE”索引,而我希望所有值(OPEN_INT,PX_LAST)都在同一个日期索引上......有什么想法吗?我尝试了 append 和 concat,但都给出了相似的结果。

            if df.empty:
                df = bbg_historicaldata(t, f, startDate, endDate)
                datesArray = list(df.index)
                tArray = [t for i in range(len(datesArray))]
                arrays = [tArray, datesArray]
                tuples = list(zip(*arrays))
                index = pd.MultiIndex.from_tuples(tuples, names=['TICKER', 'DATE'])                    
                df = pd.DataFrame({f : df[f].values}, index=index)

            else:
                temp = bbg_historicaldata(t,f,startDate,endDate)
                datesArray = list(temp.index)
                tArray = [t for i in range(len(datesArray))]
                arrays = [tArray, datesArray]
                tuples = list(zip(*arrays))
                index = pd.MultiIndex.from_tuples(tuples, names=['TICKER', 'DATE'])


                temp = pd.DataFrame({f : temp[f].values}, index=index)

                #df = df.append(temp, ignore_index = True)
                df = pd.concat([df, temp]).sortlevel()

结果:

                        OPEN_INT  PX_LAST
TICKER      DATE                          
EDH8 COMDTY 2017-02-01        NaN   98.365
            2017-02-01  1008044.0      NaN
            2017-02-02        NaN   98.370
            2017-02-02  1009994.0      NaN
            2017-02-03        NaN   98.360
            2017-02-03  1019181.0      NaN
            2017-02-06        NaN   98.405
            2017-02-06  1023863.0      NaN
            2017-02-07        NaN   98.410
            2017-02-07  1024609.0      NaN
            2017-02-08        NaN   98.435
            2017-02-08  1046258.0      NaN
            2017-02-09        NaN   98.395

基本上想得到它,所以没有 NaN!

编辑:在 concat 中添加“axis = 1”会导致以下结果(我的错是因为首先不包括额外的输出)

                        PX_LAST   OPEN_INT  PX_LAST  OPEN_INT  PX_LAST  \
TICKER      DATE                                                         
EDH8 COMDTY 2017-02-01   98.365  1008044.0      NaN       NaN      NaN   
            2017-02-02   98.370  1009994.0      NaN       NaN      NaN   
            2017-02-03   98.360  1019181.0      NaN       NaN      NaN   
            2017-02-06   98.405  1023863.0      NaN       NaN      NaN   
            2017-02-07   98.410  1024609.0      NaN       NaN      NaN   
            2017-02-08   98.435  1046258.0      NaN       NaN      NaN   
            2017-02-09   98.395  1050291.0      NaN       NaN      NaN   
EDM8 COMDTY 2017-02-01      NaN        NaN   98.245  726739.0      NaN   
            2017-02-02      NaN        NaN   98.250  715081.0      NaN   
            2017-02-03      NaN        NaN   98.235  723936.0      NaN   
            2017-02-06      NaN        NaN   98.285  729324.0      NaN   
            2017-02-07      NaN        NaN   98.295  728673.0      NaN   
            2017-02-08      NaN        NaN   98.325  728520.0      NaN   
            2017-02-09      NaN        NaN   98.280  741840.0      NaN   
EDU8 COMDTY 2017-02-01      NaN        NaN      NaN       NaN   98.130   
            2017-02-02      NaN        NaN      NaN       NaN   98.135   
            2017-02-03      NaN        NaN      NaN       NaN   98.120   
            2017-02-06      NaN        NaN      NaN       NaN   98.180   
            2017-02-07      NaN        NaN      NaN       NaN   98.190   
            2017-02-08      NaN        NaN      NaN       NaN   98.225   
            2017-02-09      NaN        NaN      NaN       NaN   98.175  

谢谢!

【问题讨论】:

    标签: python pandas dataframe


    【解决方案1】:

    您需要沿另一个轴连接:

    pd.concat([df, temp], axis=1)
    

    默认情况下,Pandas 会连接行并对齐列,这会导致您看到的结果。

    【讨论】:

    • 嗨 - 感谢您的回复。这引起了另一个令人不安的问题。在上面编辑
    【解决方案2】:

    不清楚输入的格式是什么。

    我假设 OPEN_INT 看起来像这样:

    import datetime
    import pandas as pd
    
    
    open_int = pd.DataFrame(
        [
            (datetime.date(2017, 2, 1), 1008044.0),
            (datetime.date(2017, 2, 2), 1009994.0),
            (datetime.date(2017, 2, 3), 1019181.0),
            (datetime.date(2017, 2, 6), 1023863.0),
            (datetime.date(2017, 2, 7), 1024609.0),
            (datetime.date(2017, 2, 8), 1046258.0),
        ],
        columns=['DATE', 'OPEN_INT']
    )
    open_int['TICKER'] = 'EDH8 COMDTY'
    open_int.set_index(['TICKER', 'DATE'], inplace=True)
    
    print(open_int)
    #                          OPEN_INT
    # TICKER      DATE
    # EDH8 COMDTY 2017-02-01  1008044.0
    #             2017-02-02  1009994.0
    #             2017-02-03  1019181.0
    #             2017-02-06  1023863.0
    #             2017-02-07  1024609.0
    #             2017-02-08  1046258.0
    

    PX_LAST 看起来像这样:

    px_last = pd.DataFrame(
        [
            (datetime.date(2017, 2, 1), 98.365),
            (datetime.date(2017, 2, 2), 98.370),
            (datetime.date(2017, 2, 3), 98.360),
            (datetime.date(2017, 2, 6), 98.405),
            (datetime.date(2017, 2, 7), 98.410),
            (datetime.date(2017, 2, 8), 98.435),
            (datetime.date(2017, 2, 9), 98.395),
    
        ],
        columns=['DATE', 'PX_LAST']
    )
    px_last['TICKER'] = 'EDH8 COMDTY'
    px_last.set_index(['TICKER', 'DATE'], inplace=True)
    
    print(px_last)
    #                         PX_LAST
    # TICKER      DATE
    # EDH8 COMDTY 2017-02-01   98.365
    #             2017-02-02   98.370
    #             2017-02-03   98.360
    #             2017-02-06   98.405
    #             2017-02-07   98.410
    #             2017-02-08   98.435
    #             2017-02-09   98.395
    

    然后你连接它们并得到你想要的:

    df = pd.concat([open_int, px_last], axis=1)
    print(df)
    #                          OPEN_INT  PX_LAST
    # TICKER      DATE
    # EDH8 COMDTY 2017-02-01  1008044.0   98.365
    #             2017-02-02  1009994.0   98.370
    #             2017-02-03  1019181.0   98.360
    #             2017-02-06  1023863.0   98.405
    #             2017-02-07  1024609.0   98.410
    #             2017-02-08  1046258.0   98.435
    #             2017-02-09        NaN   98.395
    

    【讨论】:

    • 嗨 - 感谢您的回复。这引起了另一个令人不安的问题。在上面编辑
    猜你喜欢
    • 1970-01-01
    • 2018-06-24
    • 2023-01-25
    • 1970-01-01
    • 2021-10-15
    • 1970-01-01
    • 2021-12-13
    • 2020-09-02
    • 2017-09-04
    相关资源
    最近更新 更多