Python Pandas Dataframe:to_dict()性能差

Python Pandas Dataframe:to_dict()性能差,python,pandas,dataframe,pivot-table,vectorization,Python,Pandas,Dataframe,Pivot Table,Vectorization,我使用返回大熊猫数据帧的API。我不知道直接迭代数据帧的快速方法,因此我使用to_dict()转换到字典 在我的数据以字典形式出现后,性能很好。但是,to_dict()操作往往是性能瓶颈 我经常将数据帧的列组合在一起形成多索引,并使用to_dict()的“索引”方向。不确定大型多索引是否导致性能不佳 有没有更快的方法来投射熊猫数据帧?也许有更好的方法可以直接在数据帧上迭代而不进行任何强制转换?不确定是否有一种方法可以应用矢量化 下面我给出了模拟计时问题的示例代码: import pandas a

我使用返回大熊猫数据帧的API。我不知道直接迭代数据帧的快速方法,因此我使用
to_dict()
转换到字典

在我的数据以字典形式出现后,性能很好。但是,
to_dict()
操作往往是性能瓶颈

我经常将数据帧的列组合在一起形成多索引,并使用
to_dict()
的“索引”方向。不确定大型多索引是否导致性能不佳

有没有更快的方法来投射熊猫数据帧?也许有更好的方法可以直接在数据帧上迭代而不进行任何强制转换?不确定是否有一种方法可以应用矢量化

下面我给出了模拟计时问题的示例代码:

import pandas as pd
import random as rd
import time

#Given a dataframe from api (model as random numbers)
df_columns = ['A','B','C','D','F','G','H','I']
dict_origin = {col:[rd.randint(0,10) for x in range(0,1000)] for col in df_columns}
dict_origin = pd.DataFrame(dict_origin)

#Transform to pivot table
t0 = time.time()
df_pivot = pd.pivot_table(dict_origin,values=df_columns[-3:],index=df_columns[:-3])
t1 = time.time()
print('Pivot Construction takes: ' + str(t1-t0))

#Iterate over all elements in pivot table
t0 = time.time()
for column in df_pivot.columns:
    for row in df_pivot[column].index:
        test = df_pivot[column].loc[row]
t1 = time.time()
print('Dataframe iteration takes: ' + str(t1-t0))


#Iteration over dataframe too slow. Cast to dictionary (bottleneck)
t0 = time.time()
df_pivot = df_pivot.to_dict('index')
t1 = time.time()
print('Cast to dictionary takes: ' + str(t1-t0))

#Iteration over dictionary is much faster
t0 = time.time()
for row in df_pivot.keys():
    for column in df_pivot[row]:
        test = df_pivot[row][column]
t1 = time.time()
print('Iteration over dictionary takes: ' + str(t1-t0))

谢谢大家!

常见的指导原则是不要迭代,对所有行、列或分组行/列使用函数。下面,在第三个代码块中,显示了如何迭代numpy数组,该数组是
.values
属性。结果是:

枢轴构造取数:0.012315988540649414

数据帧迭代需要:0.323462724668566895

对值的迭代时间:0.0043690020462036133

转换为字典需要:0.0235247611995951172

字典迭代时间:0.0010480880737304688

import pandas as pd
from io import StringIO 

# Test data
import pandas as pd
import random as rd
import time

#Given a dataframe from api (model as random numbers)
df_columns = ['A','B','C','D','F','G','H','I']
dict_origin = {col:[rd.randint(0,10) for x in range(0,1000)] for col in df_columns}
dict_origin = pd.DataFrame(dict_origin)

#Transform to pivot table
t0 = time.time()
df_pivot = pd.pivot_table(dict_origin,values=df_columns[-3:],index=df_columns[:-3])
t1 = time.time()
print('Pivot Construction takes: ' + str(t1-t0))

#Iterate over all elements in pivot table
t0 = time.time()
for column in df_pivot.columns:
    for row in df_pivot[column].index:
        test = df_pivot[column].loc[row]
t1 = time.time()
print('Dataframe iteration takes: ' + str(t1-t0))

#Iterate over all values in pivot table
t0 = time.time()
v = df_pivot.values
for row in range(df_pivot.shape[0]):
    for column in range(df_pivot.shape[1]):
        test = v[row, column]
t1 = time.time()
print('Iteration over values takes: ' + str(t1-t0))


#Iteration over dataframe too slow. Cast to dictionary (bottleneck)
t0 = time.time()
df_pivot = df_pivot.to_dict('index')
t1 = time.time()
print('Cast to dictionary takes: ' + str(t1-t0))

#Iteration over dictionary is much faster
t0 = time.time()
for row in df_pivot.keys():
    for column in df_pivot[row]:
        test = df_pivot[row][column]
t1 = time.time()
print('Iteration over dictionary takes: ' + str(t1-t0))

谢谢你的反馈jpp。我在帖子中添加了一些时间安排。此外,我倾向于使用多索引以我的数据为中心。不确定这是否是瓶颈。也许有更好的方法做旋转。谢谢jpp。我用与你链接中描述的完全相同的方式对代码计时,我猜你在寻找确切的数字?让我看看是否可以创建一个玩具示例来说明问题。发布了一个模仿我问题的玩具示例。数据帧迭代很慢,所以我使用字典。演员阵容也需要时间。非常好的解决方案!如果我理解正确,关键是使用数据帧的
values
字段并对其进行迭代。但是,如果我使用numpy数组,我似乎会丢失索引和列名。是的,它只是一个2d数组。但是,通常不需要迭代每个元素。大多数操作无需迭代即可完成。如果你提供一个例子,说明你所做的计算,也许我们可以找到另一种方法。