如何为重复索引设置多索引
How to set multindex for duplicated indices
我有一个带有重复索引的数据框 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
所以我遇到的问题与我一开始遇到的问题几乎完全相同。有没有更好的方法来解决这个问题?
这是使用 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
我的方案直接设置为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
我有一个带有重复索引的数据框 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
所以我遇到的问题与我一开始遇到的问题几乎完全相同。有没有更好的方法来解决这个问题?
这是使用 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
我的方案直接设置为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