Python 在多索引数据帧上设置值的更快方法?
我有一个很慢的代码。代码分析清楚地表明,瓶颈是我的Pandas多索引上的.loc 假设我这样初始化它:Python 在多索引数据帧上设置值的更快方法?,python,performance,pandas,Python,Performance,Pandas,我有一个很慢的代码。代码分析清楚地表明,瓶颈是我的Pandas多索引上的.loc 假设我这样初始化它: columns = pd.MultiIndex.from_product([['a','b'], np.arange(10), np.arange(1000)]) index = np.arange(10) df = pd.DataFrame(np.empty((len(index), len(columns.values))), index=index, columns=columns)
columns = pd.MultiIndex.from_product([['a','b'], np.arange(10), np.arange(1000)])
index = np.arange(10)
df = pd.DataFrame(np.empty((len(index), len(columns.values))), index=index, columns=columns)
并且.loc非常慢(使用timeit时为100ms)
我怎样才能使它更快????
目前,我发现了一个糟糕的解决方案,即使用for循环设置值(需要2毫秒),但我确信有更好的解决方案。
我希望坚持使用多索引数据帧,而不是单索引或Numpy数组
这是一种欺骗,但我建议重新问一个更简单的问题
谢谢,
蒂埃里
编辑
因为它似乎对MaxU感兴趣,下面是我的快速for循环
def mod(df, array):
k = 0
for i in [0,1]:
for j in np.arange(100):
df.at[4, ('a',i,j)] = array[k]
k += 1
return df
%timeit mod(df, np.arange(200))
100 loops, best of 3: 2.1 ms per loop
你确定这不是我们的一部分吗?你打算在循环中使用df.loc[]吗?在for循环中,我可以在单个数据(无切片)上使用df.at更快。在切片设置上,df.at的速度不比df.loc快。我是问您是否在
中调用当前的df.loc[…切片器..]
解决方案以用于。。。循环
以及是否可以避免……不,我使用.at。我编辑了我的问题。我试图问你是否在循环中调用mod()
函数?;-)
def mod(df, array):
k = 0
for i in [0,1]:
for j in np.arange(100):
df.at[4, ('a',i,j)] = array[k]
k += 1
return df
%timeit mod(df, np.arange(200))
100 loops, best of 3: 2.1 ms per loop