- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我使用返回大型 pandas 数据帧的 api。我不知道直接迭代数据帧的快速方法,因此我使用 to_dict()
转换为字典。
我的数据转成字典形式后,性能还不错。然而,to_dict()
操作往往是性能瓶颈。
我经常将数据帧的列分组在一起以形成多索引,并使用“索引”方向进行to_dict()
。不确定大型多索引是否导致性能不佳。
是否有更快的方法来转换 pandas 数据框?也许有更好的方法来直接迭代数据框而不进行任何强制转换?不确定是否有办法应用矢量化。
下面我给出了模拟计时问题的示例代码:
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.32346272468566895
迭代值需要:0.004369020462036133
转换为字典需要:0.023524761199951172
迭代字典需要: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))
关于python - Pandas 数据帧 : to_dict() poor performance,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54381559/
如何保留 header 名称的顺序。该顺序不是按字母顺序排列的,而是自定义顺序。在数据框中没问题,但是当我执行 to_dict 时,顺序不是我原来的顺序。 这是我在类里面使用的方法。 #the li
我正在尝试从我的 pandas DataFrame 创建默认字典,但 to_dict() 方法在我要写入的列的值周围创建了不需要的方括号。示例代码如下: # Create DF my_df = pd.
我正在构建一个模糊搜索程序,使用 FuzzyWuzzy 在数据集中查找匹配的名称。正如预期的那样,我的数据位于大约 10378 行的 DataFrame 中,len(df['Full name'])
在我的 Pandas DataFrame 中,我有一些日期值,我使用 datetime 从时间戳转换为日期时间。模块。打印出 DataFrame 看起来不错,但是当我使用 to_dict() 将 Da
我正在尝试将 pandas DataFrame 转换为字典列表,其中 1 个字典代表 1 行;因此 pandas to_dict(orient='records') 方法是完美的;然而,在某些情况下,
我正在尝试创建字典,但无法按我预期的方式运行。我觉得我很亲近。我是 yelp 数据的 df: import pandas as pd file_rev = 'blah.csv' reviews=pd.
我有一个 DataFrame,它似乎以下列方式出现异常(?): >>> a=z.to_dict(orient='records') >>> b=z.to_dict(orient='records')
我的主要观点是: assert_frame_equal(DataFrame.from_dict(df.to_dict()), df) 在某些情况下会失败。我很乐意提供一个可重现的示例,但是(i)数据太
我正在利用 ndb 的 to_dict 方法将对象的属性转换为 python 字典。据我所知,根据文档,此方法不包括字典中对象的键或父级: https://developers.google.com/
我有一个 pandas DataFrame df包含 Timesatamp列。 我希望从 iter.. 创建一个行迭代器(通过 to_dict 方法或通过 df )哪里Timesatamp值是 pyt
我有以下数据框df: \def \orth
我有以下数据框: 注意:日期是索引 city morning afternoon evening midnight date 2014-05-01 Y
我正在尝试将我的数据框转换为字典,以便使用这些字典来实例化一些类对象。遵循文档,http://pandas.pydata.org/pandas-docs/stable/reference/api/pa
这篇文章的要点是我的原始数据中有“23”,我希望在我的结果字典中有“23”(而不是“23.0”)。以下是我尝试使用 Pandas 处理它的方法。 我的 Excel 工作表有一个编码区域列: 23 11
嗯,这很尴尬......我正在尝试创建一个 good reproducible pandas example通过给你们我的数据集的一个小样本。我认为使用 df.to_dict() 会很简单,但无济于事
我下面的代码接收 CSV 数据,并使用 pandas to_dict() 函数作为将数据转换为 JSON 的一个步骤。 问题是它正在修改 float (例如 1.6 变成 1.600000000000
如果您有一个带有唯一索引的简洁 pandas Series 对象,那么使用 pd.Series.to_dict() 可以如您所愿:它变成一个 Python dict,每个索引都指向其各自的值。 如果您
Pandas 有一个非常好的功能,可以通过 pd.to_dict('records') 将我们的数据帧导出到字典列表中。 . 例如: d = pd.DataFrame({'a':[1,2,3], 'b
尽管在 How do I ask a good question? 上有明确的指导和 How to create a Minimal, Reproducible Example ,许多人似乎只是忽略了
我使用返回大型 pandas 数据帧的 api。我不知道直接迭代数据帧的快速方法,因此我使用 to_dict() 转换为字典。 我的数据转成字典形式后,性能还不错。然而,to_dict() 操作往往是
我是一名优秀的程序员,十分优秀!