python - 将值的顺序索引减少到python中每个值的一组顺序范围的最快方法
问题描述
我有一个大熊猫数据框,其中索引是连续整数。该列对应于该位置的一个值,一个玩具示例:
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
我已经排除了逐行迭代太慢的可能性。从Stack Exchange Code Review 中的这个答案中获得一些灵感,我在每个唯一值上使用了 enumerate + 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 中获得更好的性能?
解决方案
使用and创建groupby
密钥,dodiff
cumsum
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
推荐阅读
- go - 如何从golang go-redis中的redis.Cmder获取价值?
- ansible - 与剧本一起使用时,Ansible 设置模块的过滤器不起作用
- opencv-python - 将立方体平面切片上的点投影到球坐标
- python - FLASK 表单将数据返回为 Nonetype
- pose-estimation - Hybride动作捕捉系统(无标记+基于标记)
- javascript - 从日期数组中获取年份
- java - 打开android Spinner的下拉项禁用全屏模式
- javascript - 如何解构函数回调参数中的值?
- linux - 将多个文件粘贴到一个大文件中
- apache-spark - 具有过滤条件的 spark-avro 序列化(to_avro)在反序列化(from_avro)时抛出 ArrayIndexOutofBoundException