![](/img/trans.png)
[英]Pandas: Using a pd.Series to sort a pd.DataFrame with index
[英]Pandas pd.Series() and pd.DataFrame() are very slow
我需要一些幫助來提高以下代碼的性能。
for object in dict_of_objects.values():
test = pd.Series(object.properties) #properties is a dict
series_list.append(test)
# List comprehension is not really faster than the loop since pd.Series() takes most time
#series_list = [pd.Series(object.properties) for object in dict_of_objects.values()]
# Also very slow
df = pd.DataFrame(series_list)
在對代碼進行一些計時后,我發現pd.Series(object.properties)
和pd.DataFrame(series_list)
非常慢 - 兩者都需要大約 9 秒才能完成,而 append 只需要 0.4 秒。 因此,列表理解並不是真正的改進,因為它也調用了 pd.Series(object.properties)。
您對如何提高此性能有一些建議嗎?
最好的,朱爾茲
可以實現相同的結果,例如,如下所示:
properties_list = [o.properties for o in dict_of_objects.values()]
df = pd.DataFrame(properties_list).T
或者使用dict()
的屬性,這需要更少的操作:
properties_dict = {k: o.properties for k, o in dict_of_objects.items()}
df = pd.DataFrame.from_dict(properties_dict)
讓我們看一些代碼片段:
import numpy as np
import pandas as pd
from copy import deepcopy as cp
N_objects = 10
N_samples = 10000
class SimpleClass:
def __init__(self,prop):
self.properties = prop
dict_of_objects = {'obj{}'.format(i):
SimpleClass({
'alice' : np.random.rand(N_samples),
'bob' : np.random.rand(N_samples)
}) for i in range(N_objects)}
def slow_update(dict_of_objects):
series_list = []
for obj in dict_of_objects.values():
test = pd.Series(obj.properties)
series_list.append(test)
return pd.DataFrame(series_list)
def med_update(dict_of_objects):
return pd.DataFrame([pd.Series(obj.properties) for obj in dict_of_objects.values()])
def fast_update(dict_of_objects):
keys = iter(dict_of_objects.values()).__next__().properties.keys()
return pd.DataFrame({k: [obj.properties[k] for obj in dict_of_objects.values()] for k in keys})
並有時間安排:
>>> %timeit slow_update(dict_of_objects)
2.88 ms ± 19.5 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
>>> %timeit med_update(dict_of_objects)
2.86 ms ± 23.2 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
>>> %timeit fast_update(dict_of_objects)
344 µs ± 17.6 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
快速更新執行以下操作:
__next__
從迭代器中獲取字段。它比大多數方法快約 8 倍。
編輯:正如@koPytok 正確指出的那樣,如果每個對象的properties
屬性具有不同的 keys , fast_update
將不起作用。 如果您選擇為諸如 NoSQL 數據庫抓取之類的東西實現此功能,請記住這一點——在 MongoDB 中,文檔不需要共享相同的字段(此處交換文檔為 ZA8CFDE6331BD59EB2AC96F8911C4B666 字段)。
享受!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.