我可以将'eval'与'rolling()一起使用吗?

2024-04-20 07:51:13 发布

您现在位置:Python中文网/ 问答频道 /正文

假设我有一个pandas数据框,并且我想创建一个使用滚动窗口的新列,例如:

test = pd.DataFrame({'x': range(0,100)})
test['rol'] =  test.rolling(20,center=False).sum()

有没有办法在中使用eval函数来执行此操作


好处:我想了解evalassigndf['some_column_name'] = ...之间可能存在的性能问题(内存和速度)


2条回答

您可以使用assign,但这会创建数据帧的副本:

df = df.assign(rol=df['x'].rolling(20).sum())

或者像您这样使用直接赋值:

df['rol'] = df['x'].rolling(20,center=False).sum())

但是eval^{} window中是不可能的

您的样本的性能:

%timeit df.assign(rol=df['x'].rolling(20,center=False).sum())
845 µs ± 67.3 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

%timeit df['rol'] =  df['x'].rolling(20).sum()
699 µs ± 39.9 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

对于1000000条记录:

%timeit df.assign(rol=df['x'].rolling(20,center=False).sum())
28.5 ms ± 1.49 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)

%timeit df['rol'] =  df['x'].rolling(20).sum()
36.4 ms ± 163 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)

对于大型数据集pd.assign比直接赋值更好(我不知道为什么…)

使用assign制作管道:

test = (pd.DataFrame({'x': range(0,100)})
          .assign(rol= lambda s: s.rolling(20,center=False).sum())
       )

输出:

     x     rol
0    0     NaN
1    1     NaN
2    2     NaN
...
97  97  1750.0
98  98  1770.0
99  99  1790.0

NB。大多数操作都不是在熊猫中完成的(在没有涉及副本的意义上),即使操作有一个inplace关键字。该操作通常在副本上执行,并替换原始副本。围绕此参数的混淆是inplace在未来版本中可能会被弃用的原因

相关问题 更多 >