1

我有一个带有多索引的 DataFrame,如下所示:

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

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

4

3 回答 3

2

IIUC duplicated

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

或使用groupbyhead

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.])
于 2018-08-09T02:35:04.840 回答
1

获取您的第一个多索引的标签,将它们变成一个系列,然后找到它们与相邻的不相等的地方

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])
于 2018-08-09T02:40:55.813 回答
0
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])

Mulitindex 有一个属性标签来指示位置。这与要求的含义相同。

于 2018-08-09T02:51:57.833 回答