我有一个 Pandas 数据框,其中索引是连续的整数。该列对应于该位置的值,一个玩具示例:
a = pd.DataFrame(index=range(7),data = [1.3,1.3,1.3,0.4,0.6,0.6,1.3], columns=['Values'])
Values
0 1.3
1 1.3
2 1.3
3 0.4
4 0.6
5 0.6
6 1.3
有没有一种快速的方法可以将其减少为一组顺序范围:
start end Values
0 3 1.3
3 4 0.4
4 6 0.6
6 7 1.3
我已经排除了逐行迭代太慢的可能性。从中获得一些灵感 answer in Stack Exchange Code Review ,我在每个唯一值上使用了枚举 + groupby 模式:
for val in set(a['Values'].values):
index = list(a[list(a['Values'] == val)].index.values)
for _, g in groupby(index, key=lambda n, c=count(): n-next(c)):
l = list(g)
print(l[0], l[-1]+1, val)
3 4 0.4
0 3 1.3
6 7 1.3
4 6 0.6
然后我可以存储和排序。无论如何要改进它以在 python 中获得更好的性能?
最佳答案
使用 diff
和 cumsum
创建 groupby
键,执行 groupby
b=a.reset_index().groupby(a.Values.diff().ne(0).cumsum()).\
agg(start=('index','min'),
end=('index',lambda x : x.max()+1),
Values=('Values','first'))
start end Values
Values
1 0 3 1.3
2 3 4 0.4
3 4 6 0.6
4 6 7 1.3
关于python - 将值的顺序索引减少到 python 中每个值的一组顺序范围的最快方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61576157/