【问题标题】:Merging multiple dataframes with non unique indexes合并具有非唯一索引的多个数据帧
【发布时间】:2015-06-21 18:19:58
【问题描述】:

给定两个具有非唯一索引和多维列的 DF:

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

切:

           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

我所知道的 Pandas 工具都没有工作:mergejoinconcat。合并的外连接提供了一个点积,这不是我想要的,而concat 无法处理非唯一索引。

您对如何实现这一点有任何想法吗?

注意:数据帧的长度不会相同。

【问题讨论】:

    标签: python python-3.x join pandas merge


    【解决方案1】:

    你需要使用pandas.merge:

    pd.merge(ars, che, left_index = True, right_index = True, how = 'outer')
    

    它可以处理非唯一索引和不同大小的数据帧。

    【讨论】:

    • 谢谢!我将左右索引参数设置为 True 并得到了我需要的结果。
    【解决方案2】:

    我已经设法使用 pandas 的 concat 方法对其进行了整理。

    首先,我们需要添加一个 Multiindex 级别,使其变得唯一:

    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
    

    【讨论】:

      【解决方案3】:

      您想为join 使用on='outer' 参数(test1.csvtest2.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
      

      【讨论】:

      • 嗨,谢谢输入。它在这个例子中确实有效,其中帧的长度是缩进的。但是,在我的情况下并不能保证。
      • 我尝试了不同的行数,它似乎工作正常。
      猜你喜欢
      • 2016-05-01
      • 1970-01-01
      • 2018-09-22
      • 2020-10-21
      • 1970-01-01
      • 2021-05-16
      • 1970-01-01
      • 2020-11-02
      相关资源
      最近更新 更多