Python 添加新的多索引级别
我有一个数据帧:Python 添加新的多索引级别,python,pandas,Python,Pandas,我有一个数据帧: d = pd.DataFrame({'i1': ['A', 'B', 'C', 'D', 'E'], 'i2': ['I', 'II', 'III', 'IV', 'V'], 'val': ["lol1", "lol2", "lol3", "lol4", "lol5"]}).set_index(["i1", "i2"]) val i1 i2 A I lol1 B I
d = pd.DataFrame({'i1': ['A', 'B', 'C', 'D', 'E'],
'i2': ['I', 'II', 'III', 'IV', 'V'],
'val': ["lol1", "lol2", "lol3", "lol4", "lol5"]}).set_index(["i1", "i2"])
val
i1 i2
A I lol1
B II lol2
C III lol3
D IV lol4
E V lol5
我需要使用pandas API从值[5,10,15]
,添加新的索引级别i3
,因此它看起来像:
val
i1 i2 i3
A I 5 lol1
10 lol1
15 lol1
B II 5 lol2
10 lol2
15 lol2
C III 5 lol3
10 lol3
15 lol3
D IV 5 lol4
10 lol4
15 lol4
E V 5 lol5
10 lol5
15 lol5
我的尝试(丑陋):
另外,我一直在寻找
pd.MultiIndex.from_product
,但无论我做什么,它都将从i1
和i2
进行组合。根据MultiIndex
中的值创建元组列表,然后使用:
虽然这是可行的,但首先手动创建所有元组组合似乎相当麻烦。难道不应该有一种更有效的方法不需要迭代创建元组吗?@MoorzTech-另一个想法应该是使用交叉连接,但对我来说似乎更疯狂;)
d.reset_index().assign(tmp=1)。merge(pd.DataFrame({'i3':vals,'tmp':1}),on='tmp')。drop('tmp',1)。set_index(['i1','i2','i3'))
d = np.repeat(d.reset_index().values, 3, 0)
i3 = [5, 10, 15]
r2 = np.tile(i3, 5)
r = np.concatenate([d, r2.reshape(-1, 1)], 1)
d = pd.DataFrame(r, columns=["i1", "i2", "val", "i3"])
d = d.set_index(["i1", "i2", "i3"])
vals = [5, 10, 15]
tups = [x + (i,) for x in d.index for i in vals]
d = d.reindex(pd.MultiIndex.from_tuples(tups, names=['i1','i2','i3']))
print (d)
val
i1 i2 i3
A I 5 lol1
10 lol1
15 lol1
B II 5 lol2
10 lol2
15 lol2
C III 5 lol3
10 lol3
15 lol3
D IV 5 lol4
10 lol4
15 lol4
E V 5 lol5
10 lol5
15 lol5