我有一个像这样的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循环,即它应该被矢量化。
答案 0 :(得分:3)
我认为您可以cumcount
使用Index.to_series
(与Series
或DataFrame
一起使用MultiIndex.from_arrays
或Series
构造函数)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
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