【问题标题】:How to set multindex for duplicated indices如何为重复索引设置多索引
【发布时间】:2019-09-16 03:11:08
【问题描述】:

我有一个带有重复索引的数据框 df:

        a
o_idx
411     x
412     y
412     x
412     z
450     a
450     b

我想将多索引分配给重复的行,例如:

                    a
o_idx    index
411        0        x
412        0        y
412        1        x
412        2        z
450        0        a
450        1        b

如果新索引不是重复的,则为 0。如果是重复的,新的索引应该是重复多少次的长度范围。

我首先尝试通过消除重复项来制作两个数据帧:

a = df[~df.index.duplicated(keep=False)]
a = a.reset_index()
a.index = np.zeros(len(a.index), dtype = int)
a = a.reset_index()
a = a.set_index(['index', 'o_idx'])
a.index.names = ['index', 'o_idx']

然后获取重复项:

b = df[df.index.duplicated(keep=False)]
b = b.reset_index()
b.index = range(len(b.index))
b = b.reset_index()
b = b.set_index(['index', 'o_idx'])
b.index.names = ['index', 'o_idx']

然后连接:

c = pd.concat([a,b])

但这并没有给我正确的结果,因为 b 等于:

                    a
o_idx    index
412        0        y
412        1        x
412        2        z
450        3        a
450        4        b

所以我遇到的问题和我一开始遇到的问题差不多。有没有更好的方法来解决这个问题?

【问题讨论】:

    标签: python-3.x pandas dataframe analysis


    【解决方案1】:

    这是一种使用cumcount然后set_index返回的方法

    yourdf=df.assign(index=df.groupby(level=0).cumcount()).set_index('index',append=True)
    yourdf
    Out[568]: 
                 a
    o_idx index   
    411   0      x
    412   0      y
          1      x
          2      z
    450   0      a
          1      b
    

    【讨论】:

      【解决方案2】:

      我的解决方案直接设置为index

      In [1649]: df.set_index(df.groupby(level=0).cumcount(), append=True)
      Out[1649]:
             a
      411 0  x
      412 0  y
          1  x
          2  z
      450 0  a
          1  b
      

      【讨论】:

        猜你喜欢
        • 2021-10-30
        • 1970-01-01
        • 1970-01-01
        • 2021-07-05
        • 2013-03-27
        • 2017-05-31
        • 2021-05-11
        • 1970-01-01
        • 2021-10-26
        相关资源
        最近更新 更多