代码之家  ›  专栏  ›  技术社区  ›  Alex

基于其他序列索引从数据帧中选择行

  •  2
  • Alex  · 技术社区  · 6 年前

    我有一个 DataFrame ,数据框,带 MultiIndex 属于 (id1, id2, date) 还有一堆柱子。我有一个 Series ,S,那是 (id1, id2) 作为索引和 date 作为价值观。我想选择df中的所有行 (ID1,ID2,日期) 匹配S中的相应值。什么是最佳方法?

    我想我可以重新设置索引 s df 然后使用列作为连接列来执行右外部 merge .这并不是很好,因为它需要重置散列索引,这样合并比使用列更快。似乎不可能有 系列 没有值(只是索引为 (ID1,ID2,日期) )在这种情况下这是最理想的。还有其他想法吗?

    1 回复  |  直到 6 年前
        1
  •  2
  •   jezrael    6 年前

    你可以 merge 按列名称和索引 pandas 0.23.0+ 以下内容:

    print (df.merge(s.to_frame(), on=['id1','id2','date']))
    

    样品 以下内容:

    df = pd.DataFrame({'date':pd.date_range('2015-01-01', periods=6),
                       'id1':[4,5,4,5,5,4],
                       'id2':[7,8,9,4,2,3],
                       'F':list('aaabbb')}).set_index(['id1','id2','date'])
    
    print (df)
                        F
    id1 id2 date         
    4   7   2015-01-01  a
    5   8   2015-01-02  a
    4   9   2015-01-03  a
    5   4   2015-01-04  b
        2   2015-01-05  b
    4   3   2015-01-06  b
    
    s = pd.DataFrame({'date':pd.date_range('2015-01-01', periods=3), 
                      'id1':[4,5,0], 
                      'id2':[7,8,2]}).set_index(['id1','id2'])['date']
    print (s)
    id1  id2
    4    7     2015-01-01
    5    8     2015-01-02
    0    2     2015-01-03
    Name: date, dtype: datetime64[ns]
    
    df1 = df.merge(s.to_frame(), on=['id1','id2','date'])
    print (df1)
                  date  F
    id1 id2              
    4   7   2015-01-01  a
    5   8   2015-01-02  a
    

    另一个解决方案:

    df1 = df.reset_index().merge(s.reset_index(), on=['id1','id2','date'])
    print (df1)
       id1  id2       date  F
    0    4    7 2015-01-01  a
    1    5    8 2015-01-02  a
    

    解决方案 reindex 是可能的,但需要 MultiIndex 锿:

    s_index = s.to_frame().assign(tmp=1).set_index('date', append=True).index
    idx = df.index.intersection(s_index)
    df1 = df.reindex(idx)
    print (df1)
    
                        F
    id1 id2 date         
    4   7   2015-01-01  a
    5   8   2015-01-02  a