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])
请注意,如果您对 df
的 id
索引级别进行拆分,那么您会得到:
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
我有一个多索引数据框,级别为 '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])
请注意,如果您对 df
的 id
索引级别进行拆分,那么您会得到:
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