我有一个多指数数据框,其级别为'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])
答案 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