python - 将值的顺序索引减少到 python 中每个值的一组顺序范围的最快方法

标签 python pandas performance

我有一个 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 中获得更好的性能?

最佳答案

使用 diffcumsum 创建 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/

相关文章:

sorting - Pandas 数据透视表嵌套排序

python - 搜索 csv 文件,这是最佳实践?

python - wrapper() 得到了一个意外的关键字参数 'id'

python - PuLP 中的线性整数优化

python - 迁移时 Django 错误(int() 和 datetime.datetime)

python - 在 Windows 上为 Python 2.7 构建 lxml

python - 在 Pandas 中过滤数据框时复制警告

c# - 对 Azure 网站上 CPU 使用率攀升进行故障排除

iphone - - [NSUserDefaults 同步] iOS 上的性能问题

python - 为什么在 python 2.7 和 python 3.4 性能中创建类之间存在差异