按顺序标记索引以复制DataFrame索引

时间:2017-07-31 06:37:39

标签: pandas numpy

我有一个像这样的DataFrame:

df = pd.DataFrame([100,200,300], [1,1,2])

     0
1  100
1  200
2  300

我想添加一个二级索引(MultiIndex),所以它看起来像这样:

           0
index i2     
1     0  100
      1  200
2     0  300

也就是说,我希望第二级索引(此处称为i2)为零,其中df.duplicated()为False(意味着索引与上面的索引不同),并且是其他行的序号。

一般的想法是通过引入一个从零开始的附加索引级别来获取具有重复项的索引并使其不再具有重复项,并且仅在需要时增加以保持每行的完整索引唯一。

解决方案应该使用NumPy或Pandas函数,而不是Python循环,即它应该被矢量化。

1 个答案:

答案 0 :(得分:3)

我认为您可以cumcount使用Index.to_series(与SeriesDataFrame一起使用MultiIndex.from_arraysSeries构造函数)John Galt

s = df.index.to_series()
#alternative solution
#s = pd.Series(df.index)
s = s.groupby(s).cumcount()
df.index = pd.MultiIndex.from_arrays([df.index, s], names=['index','i2'])
print (df)
            0
index i2     
1     0   100
      1   200
2     0   300

谢谢binary search

df.index = pd.MultiIndex.from_arrays([df.index, df.groupby(df.index).cumcount()],
                                     names=['index','i2'])

print (df)
            0
index i2     
1     0   100
      1   200
2     0   300
df.index = pd.MultiIndex.from_arrays([df.index, df.groupby(level=0).cumcount()],
                                     names=['index','i2'])
print (df)
            0
index i2     
1     0   100
      1   200
2     0   300