Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/289.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何获取数据帧中连续增加的数据点个数_Python_Optimization_Pandas_While Loop_Cpu Cache - Fatal编程技术网

Python 如何获取数据帧中连续增加的数据点个数

Python 如何获取数据帧中连续增加的数据点个数,python,optimization,pandas,while-loop,cpu-cache,Python,Optimization,Pandas,While Loop,Cpu Cache,提前谢谢你的帮助! 我有一个数据帧。比如说,对于colume incr,如果0 1 1-1 0 1 1…的数字,我想得到解析列表并得到每个数据点,数据列表增加了多少倍(或者更确切地说没有减少);点的减少会将当前数据点的输出重置为零。例如列表(代码中命名为output['inc_adj']) 0 1 1 1 -1 0 1 -1 我应该在代码中得到命名输出['cont_inc'] 12340120 我写了下面的代码,但是效率很低,有什么建议可以显著提高效率吗?似乎我一直在两个循环中重新加载CPU中的

提前谢谢你的帮助! 我有一个数据帧。比如说,对于colume incr,如果0 1 1-1 0 1 1…的数字,我想得到解析列表并得到每个数据点,数据列表增加了多少倍(或者更确切地说没有减少);点的减少会将当前数据点的输出重置为零。例如列表(代码中命名为output['inc_adj']) 0 1 1 1 -1 0 1 -1 我应该在代码中得到命名输出['cont_inc'] 12340120

我写了下面的代码,但是效率很低,有什么建议可以显著提高效率吗?似乎我一直在两个循环中重新加载CPU中的缓存(如果我感觉正确的话),但在当前阶段,我找不到更好的解决方案


提前谢谢

如果内存允许,我建议创建一个包含所有相邻值的列表,以便开始比较(在我的示例中使用zip),并将结果附加到新列表,完成后将整个结果列表重新分配回数据框

虽然这听起来很奇怪,但实际上它通过消除常数数据帧索引/值查找的一些开销稍微提高了性能:

import pandas as pd
import random

# random DataFrame with values from -1 to 2
df = pd.DataFrame([random.randint(-1, 2) for _ in xrange(999)], columns=['inc_adj'])
df['cont_inc'] = 0

def calc_inc(df):
    inc = [1]
    # I use zip to PREPARE the adjacent values
    for i, n in enumerate(zip(df['inc_adj'][1:], df['inc_adj'][:-1]), 0):
        if n[0] >= n[1]:
            inc.append(inc[i]+1)
            continue
        inc.append(0)
    df['cont_inc'] = inc

作为比较,使用索引和/或查找和就地分配,类似的编码逻辑:

def calc_inc_using_ix(df):
    for idx, row in df.iterrows():
        try:
            if row['inc_adj'] >= df['inc_adj'][idx-1]:
                row['cont_inc'] = df['cont_inc'][idx-1] + 1
                continue
            row['cont_inc'] = 0
        except KeyError:
            row['cont_inc'] = 1


也就是说,我还对任何其他能够进一步提高性能的解决方案感兴趣,我始终愿意学习。

非常感谢您的帮助。它以更好的性能解决了我的问题。我可以将整个列表分成几个部分,以适应大型数据集的内存。非常感谢你的帮助@Tsigalko2003,没问题,我也很想看到性能和效率:)
calc_inc(df)

df.head()
   inc_adj  cont_inc
0        0         1
1        0         2
2        1         3
3       -1         0
4        0         1

%timeit calc_inc(df)
1000 loops, best of 3: 696 µs per loop
def calc_inc_using_ix(df):
    for idx, row in df.iterrows():
        try:
            if row['inc_adj'] >= df['inc_adj'][idx-1]:
                row['cont_inc'] = df['cont_inc'][idx-1] + 1
                continue
            row['cont_inc'] = 0
        except KeyError:
            row['cont_inc'] = 1
calc_inc_using_ix(df)

df.head()
   inc_adj  cont_inc
0        0         1
1        1         2
2        1         3
3        0         0
4        2         1

%timeit calc_inc_using_ix(df)
10 loops, best of 3: 58.5 ms per loop