如何在Pandas系列中找到某个值的 last occurrence索引?例如,假设我有一个如下所示的Series:
s = pd.Series([False, False, True, True, False, False])
我想找到True值的最后一个索引(即索引3),你会怎么做?
True
jei2mxaa1#
使用last_valid_index:
last_valid_index
s = pd.Series([False, False, True, True, False, False]) s.where(s).last_valid_index()
输出:
3
使用@user3483203示例
s = pd.Series(['dog', 'cat', 'fish', 'cat', 'dog', 'horse'], index=[*'abcdef']) s.where(s=='cat').last_valid_index()
产出
'd'
nfs0ujit2#
使用nonzero
nonzero
s.nonzero()[0][-1] Out[66]: 3
字符串
t98cgbkg3#
如果您在布尔数组中查找,则可以在反向系列上使用np.argmax:
np.argmax
>>> len(s) - np.argmax(s[::-1].values) - 1 3
如果您正在查找另一个值,只需使用==将其转换为布尔数组下面是查找dog最后一次出现的示例:
==
dog
>>> s = pd.Series(['dog', 'cat', 'fish', 'cat', 'dog', 'horse']) >>> len(s) - np.argmax(s[::-1].values=='dog') - 1 4
然而,这将给予你一个数字索引。如果你的系列有一个自定义索引,它不会返回那个。
34gzjxbg4#
可以将生成器表达式用于next和enumerate:
next
enumerate
s = pd.Series([False, False, True, True, False, False]) res = len(s) - next(idx for idx, val in enumerate(s[::-1], 1) if val) # 3
这对于接近末尾具有True值的大型系列将更有效。
3duebb1j5#
我发现这个问题的最佳解决方案如下,假设Pandas系列存储在变量s中
~s.duplicated(keep="last")
这将返回一个panda系列,指示该行是否包含每个值的最后一次出现
5条答案
按热度按时间jei2mxaa1#
使用
last_valid_index
:输出:
使用@user3483203示例
产出
nfs0ujit2#
使用
nonzero
字符串
t98cgbkg3#
如果您在布尔数组中查找,则可以在反向系列上使用
np.argmax
:如果您正在查找另一个值,只需使用
==
将其转换为布尔数组下面是查找
dog
最后一次出现的示例:然而,这将给予你一个数字索引。如果你的系列有一个自定义索引,它不会返回那个。
34gzjxbg4#
可以将生成器表达式用于
next
和enumerate
:这对于接近末尾具有
True
值的大型系列将更有效。3duebb1j5#
我发现这个问题的最佳解决方案如下,假设Pandas系列存储在变量s中
这将返回一个panda系列,指示该行是否包含每个值的最后一次出现