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

Pandas重置多索引的内部级别

  •  9
  • KOB  · 技术社区  · 6 年前

    我有以下格式的DF:

                       col1    col2
    ID          Date
     1    1993-12-31      4       6
          1994-12-31      8       5
          1995-12-31      4       7
          1996-12-31      3       3
     2    2000-12-31      7       8
          2001-12-31      5       9
          2002-12-31      8       4
    

                 col1    col2
    ID    Date
     1       0      4       6
             1      8       5
             2      4       7
             3      3       3
     2       0      7       8
             1      5       9
             2      8       4
    

    我只是想 df.reset_index(level='Date', inplace=True, drop=True) 会的,但不会。

    4 回复  |  直到 6 年前
        1
  •  5
  •   cs95 abhishek58g    6 年前

    使用 pd.MultiIndex.from_arrays groupby + cumcount .

    df.index = pd.MultiIndex.from_arrays(
        [df.index.get_level_values(0), df.groupby(level=0).cumcount()],
        names=['ID', 'Date'])
    

    df
             col1  col2
    ID Date            
    1  0        4     6
       1        8     5
       2        4     7
       3        3     3
    2  0        7     8
       1        5     9
       2        8     4
    

    这不能概括为N个级别,但是应该有 df.index.set_levels

        2
  •  5
  •   user3483203    6 年前

    使用 set_index cumcount :

    tmp = df.reset_index('Date', drop=True)
    tmp.set_index(df.groupby(level=0).cumcount().rename('Date'), append=True)
    
             col1  col2
    ID Date
    1  0        4     6
       1        8     5
       2        4     7
       3        3     3
    2  0        7     8
       1        5     9
       2        8     4
    
        3
  •  4
  •   sacuL    6 年前

    ID ,然后使用 apply

    new_df = (df.groupby(df.index.get_level_values('ID'))
              .apply(lambda x: x.reset_index()).drop(['ID','Date'],1))
    
    new_df.index = new_df.index.rename(['ID','Date'])
    
    >>> new_df
             col1  col2
    ID Date            
    1  0        4     6
       1        8     5
       2        4     7
       3        3     3
    2  0        7     8
       1        5     9
       2        8     4
    
        4
  •  3
  •   piRSquared    6 年前

    新答案

    虽然没有老答案那么酷,但我宁愿准确,也不愿冷静。

    from collections import defaultdict
    from itertools import count
    d = defaultdict(count)
    
    lbl = []
    for a, *_ in df.index.values:
        lbl.append(next(d[a]))
    
    lvl = pd.RangeIndex(max(lbl) + 1)
    
    df.set_index(df.index.set_labels(lbl, 1).set_levels(lvl, 1))
    
             col1  col2
    ID Date            
    1  0        4     6
       1        8     5
       2        4     7
       3        3     3
    2  0        7     8
       1        5     9
       2        8     4
    

    不使用

    我看错了这个问题。我不认为每个组都需要重置新索引。

    希望对某人有用。

    pandas.MultiIndex.set_levels

    n = 1
    lvl = df.index.levels[n]
    new_lvl = pd.RangeIndex(len(lvl))
    new_idx = df.index.set_levels(new_lvl, n)
    df.set_index(new_idx)
    
             col1  col2
    ID Date            
    1  0        4     6
       1        8     5
       2        4     7
       3        3     3
    2  4        7     8
       5        5     9
       6        8     4
    

    一行

    耶! \o/

    df.set_index(df.index.set_levels(pd.RangeIndex(len(df.index.levels[1])), 1))
    
             col1  col2
    ID Date            
    1  0        4     6
       1        8     5
       2        4     7
       3        3     3
    2  4        7     8
       5        5     9
       6        8     4
    

    到位

    df.index.set_levels(pd.RangeIndex(len(df.index.levels[1])), 1, inplace=True)
    df
    
             col1  col2
    ID Date            
    1  0        4     6
       1        8     5
       2        4     7
       3        3     3
    2  4        7     8
       5        5     9
       6        8     4