2024-04-20 07:51:13 发布
网友
假设我有一个pandas数据框,并且我想创建一个使用滚动窗口的新列,例如:
test = pd.DataFrame({'x': range(0,100)}) test['rol'] = test.rolling(20,center=False).sum()
有没有办法在中使用eval函数来执行此操作
eval
好处:我想了解eval、assign和df['some_column_name'] = ...之间可能存在的性能问题(内存和速度)
assign
df['some_column_name'] = ...
您可以使用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比直接赋值更好(我不知道为什么…)
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在未来版本中可能会被弃用的原因
inplace
您可以使用
assign
,但这会创建数据帧的副本:或者像您这样使用直接赋值:
但是} window 中是不可能的
eval
在^{您的样本的性能:
对于1000000条记录:
对于大型数据集
pd.assign
比直接赋值更好(我不知道为什么…)使用
assign
制作管道:输出:
NB。大多数操作都不是在熊猫中完成的(在没有涉及副本的意义上),即使操作有一个
inplace
关键字。该操作通常在副本上执行,并替换原始副本。围绕此参数的混淆是inplace
在未来版本中可能会被弃用的原因相关问题 更多 >
编程相关推荐