写入Pandas multindex数据帧的切片速度很慢

2024-06-26 14:42:57 发布

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

我有一个大型for循环,用于计算许多变量,最终我希望将这些变量存储在Pandas多索引数据帧中。循环的每一步,我都需要写入数据帧的一个片段。datafram有两行索引和许多列。每个操作都需要写入一个定义为:所有顶级索引、一个特定的第二个索引和一个特定列的切片。下面是一个操作示例

import numpy as np
import pandas as pd
n_paths = 1000
pathgrid=np.arange(1, n_paths + 1)
dt = 0.25
T = 40
timegrid = np.arange(0, T + dt, dt)
multiindex = pd.MultiIndex.from_product([pathgrid, timegrid], names=['Path', 'Timestep'])
df=pd.DataFrame(index=multiindex,columns=['Values'])

input = np.random.random_sample(n_paths)
i=0
%timeit df.loc[(pathgrid,i),'Values'] = input

868 ms ± 8.09 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

我发现这非常慢,这使得我的整个运行时非常慢,因为操作需要执行数百次。有没有一种更快的方法可以使用熊猫来实现这一点?我知道的唯一替代方法是将值存储在单独的Numpy数组中,并在循环后将Numpy数组写入数据帧。但这意味着我必须创建大量这些临时数组


Tags: 数据importdfinputasnpdt数组
1条回答
网友
1楼 · 发布于 2024-06-26 14:42:57
df.loc[(pathgrid,i),'Values'] = input

执行从inputlen(input)Timestep==0.0经过的行的相应值赋值。因此它是缓慢的

我建议使用函数一次性赋值:

import numpy as np
import pandas as pd


def assignValue(df, timestep, values):
    for path, new_df in df.groupby(level=0):
        new_df.loc[(path, timestep)] = values[path-1]


n_paths = 1000
pathgrid=np.arange(1, n_paths + 1)
dt = 0.25
T = 40

timegrid = np.arange(0, T + dt, dt)

multiindex = pd.MultiIndex.from_product(
    [pathgrid, timegrid], names=['Path', 'Timestep'])

df = pd.DataFrame(index=multiindex, columns=['Values'])

input = np.random.random_sample(n_paths)

i = 0
%timeit assignValue(df, 0.0, input)

从我的电脑上看,新代码需要315毫秒,而原来的代码需要1.49秒

更新

原始代码不会更新原始dataframe对象。我使用for循环和.loc修改行,速度更快

import numpy as np
import pandas as pd


n_paths = 1000
dt = 0.25
T = 40

pathgrid=np.arange(1, n_paths + 1)
timegrid = np.arange(0, T + dt, dt)

multiindex = pd.MultiIndex.from_product(
    [pathgrid, timegrid],
    names=['Path', 'Timestep']
)

df = pd.DataFrame(index=multiindex, columns=['Values'])

inputs = np.random.random_sample(n_paths)
%timeit for i in range(1, n_paths+1): df.loc[(i, 0.0)] = inputs[i-1]

新代码现在需要80.1毫秒

相关问题 更多 >