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])