Python 如何获取数据帧中连续增加的数据点个数
提前谢谢你的帮助! 我有一个数据帧。比如说,对于colume incr,如果0 1 1-1 0 1 1…的数字,我想得到解析列表并得到每个数据点,数据列表增加了多少倍(或者更确切地说没有减少);点的减少会将当前数据点的输出重置为零。例如列表(代码中命名为output['inc_adj']) 0 1 1 1 -1 0 1 -1 我应该在代码中得到命名输出['cont_inc'] 12340120 我写了下面的代码,但是效率很低,有什么建议可以显著提高效率吗?似乎我一直在两个循环中重新加载CPU中的缓存(如果我感觉正确的话),但在当前阶段,我找不到更好的解决方案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中的
提前谢谢 如果内存允许,我建议创建一个包含所有相邻值的列表,以便开始比较(在我的示例中使用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