pandas在多索引帧中计算真值

时间:2015-06-21 01:25:21

标签: python pandas multi-index

我有一个多指数数据框,其级别为'id'和'year':

id    year
1     2001    True
      2002    True
2     2001    False
      2002    True
3     2001    True
      2002    True

我想检查每个id级别,连续年份布尔值是否为True,然后计算这种情况发生的次数。在上述情况下,因为对于id 1和id 3,满足该条件,则计数将为2。

我尝试生成这样的假人(之后使用np.count_nonzero(01_02)),但这显然是错误的:

01_02 = (df[df.index.get_level_values(1) == 2001]) & (df[
    df.index.get_level_values(1) == 2002])

1 个答案:

答案 0 :(得分:1)

请注意,如果您取消id df的{​​{1}}索引级别,那么您会得到:

In [35]: df.unstack(['id'])
Out[35]: 
       val             
id       1      2     3
year                   
2001  True  False  True
2002  True   True  True

我们可以将上面的值视为布尔数组arr

arr = df.unstack(['id']).values
# array([[ True, False,  True],
#        [ True,  True,  True]], dtype=bool)

想象一下除了最后一行之外的所有数组行:

In [44]: arr[:-1]
Out[44]: array([[ True, False,  True]], dtype=bool)

并将其与除第一行之外的所有数组行进行比较:

In [45]: arr[1:]
Out[45]: array([[ True,  True,  True]], dtype=bool)

我们想要计算它们相等的多少个位置,也等于True:

In [41]: ((arr[:-1] == arr[1:]) & (arr[:-1] == True)).sum()
Out[41]: 2