我有一个关于这个prior StackOverflow question的后续问题。
假设我有以下NumPy数组:
import numpy as np
v = np.array([
0, 0, 0, 1, 3, 3, 1, 1, 1, 1, 1, 0, 2, 3, 2, 1, 1, 0, 0, 1, 3, 3,
3, 2, 0, 0, 0, 0, 1, 1, 1, 2, 1, 0, 0, 0, 0, 0, 1, 2, 2, 1, 0, 0,
1, 1, 1, 0, 0, 0, 1, 2, 2, 1, 0, 0, 1, 1, 1, 1, 1, 2, 1, 1, 2, 0,
0, 1, 2, 2, 2, 2, 1, 1, 2, 2, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 2,
2, 0, 0, 0, 0, 1])
我试图获得所有重复元素序列及其起始索引的列表。我的直觉是,使用Pandas是实现这一目标的最直接的方法。
使用前面引用的StackOverflow答案,我写了以下内容:
import pandas as pd
df = pd.DataFrame(v, columns=['digit'])
df["seq_len"] = df.groupby(
(df["digit"] != df["digit"].shift()).cumsum()
)["digit"].cumcount()+1
产生结果:
digit seq_len
0 0 1
1 0 2
2 0 3
3 1 1
4 3 1
.. ... ...
89 0 1
90 0 2
91 0 3
92 0 4
93 1 1
我需要做的最后一件事是删除“digit”列沿着的重复项,以便保留最后一个“seq_len”值。通常,你可以使用Pandas duplicated
或drop_duplicates
,但是这些函数不会沿着列进行任何重置。
我不想要的是:
>>> df.drop_duplicates(subset='digit', keep='last')
digit seq_len
22 3 3
88 2 3
92 0 4
93 1 1
我想要的是:
>>> magic_function(df)
digit seq_len
2 0 3
3 1 1
5 3 2
10 1 5
.. ... ...
88 2 3
92 0 4
93 1 1
当然,如果我执行“index-seq_len + 1”,我可以获得真正的起始索引,例如,
index digit seq_len
0 0 3
3 1 1
4 3 2
6 1 5
.. ... ...
86 2 3
89 0 4
92 1 1
因此,无论如何,寻找任何关于高效magic_function()
的建议来完成上述任务。感谢所有的帮助!
4条答案
按热度按时间5cg8jx4n1#
你可以使用
GroupBy.apply
和 boolean indexing:输出:
5uzkadbs2#
虽然不太好,但这似乎是可行的:
nkkqxpd93#
您可以使用内置的groupby函数
first
/last
和size
。对于最后一个索引,我使用了一个简单的lambda,但我感觉有一种更直接的方法我忘记了。woobm2wo4#
这也应该起作用:
或
或
输出: