Pandas 多索引向量设置

Pandas 多索引向量设置,pandas,multi-index,Pandas,Multi Index,我有一个多索引的数据帧,如下所示: 0 1 2 a 0 0.928295 0.828225 -0.612509 1 1.103340 -0.540640 -0.344500 2 -1.760918 -1.426488 -0.647610 3 -0.782976 0.359211 1.601602 4 0.334406 -0.508752 -0.611212 b 2 0.717163 0.9025

我有一个多索引的数据帧,如下所示:

             0         1         2
 a 0  0.928295  0.828225 -0.612509
   1  1.103340 -0.540640 -0.344500
   2 -1.760918 -1.426488 -0.647610
   3 -0.782976  0.359211  1.601602
   4  0.334406 -0.508752 -0.611212
 b 2  0.717163  0.902514  1.027191
   3  0.296955  1.543040 -1.429113
   4 -0.651468  0.665114  0.949849
 c 0  0.195620 -0.240177  0.745310
   1  1.244997 -0.817949  0.130422
   2  0.288510  1.123550  0.211385
   3 -1.060227  1.739789  2.186224
   4 -0.109178 -1.645732  0.022480
 d 3  0.021789  0.747183  0.614485
   4 -1.074870  0.407974 -0.961013

What I want : array([1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0])
现在我想生成一个零向量,它有这个数据帧的样本长度,并且在level[1]索引的第一个元素上只有一个。 例如,这里df的形状为(15,3)。因此我想得到一个长度为15的向量,在(a,0),(b,2),(c,0),(d,3)和其他点上应该有1和0。 我怎样才能生成这样的向量呢?(如果可能,不要循环获取每个子向量,然后使用np.concatenate())非常感谢!

IIUC
重复

(~df.index.get_level_values(0).duplicated()).astype(int)
Out[726]: array([1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0])
或者使用
groupby
head

df.loc[df.groupby(level=0).head(1).index,'New']=1
df.New.fillna(0).values
Out[721]: array([1., 0., 0., 0., 0., 1., 0., 0., 1., 0., 0., 0., 0., 1., 0.])
获取第一个多重索引的值,将它们转换为一个系列,然后找到它们与相邻索引不相等的地方

labels = pd.Series(df.index.labels[0])

v = labels.ne(labels.shift()).astype(int).values

>>> v
array([1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0])
Mulitindex有一个属性标签来指示位置。
这与要求的含义相同。

重复的
方法很好!谢谢你的回答,我刚刚找到了一个更简单的解决方案。谢谢你。@Kid hi,你可以投票选择答案并接受你喜欢的答案之一
pd.Index(df.labels[0])
Int64Index([0, 0, 0, 0, 0, 1, 1, 1, 2, 2, 2, 2, 2, 3, 3], dtype='int64')
res = pd.Index(df.labels[0]).duplicated(keep='first')
array([False,  True,  True,  True,  True, False,  True,  True, False,
       True,  True,  True,  True, False,  True])