pandas 计算多索引框架中的真值

pandas count true values in multi-index frame

我有一个多索引数据框,级别为 '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])

请注意,如果您对 dfid 索引级别进行拆分,那么您会得到:

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