[英]multidimensional computation using pandas dataframe
我們目前使用 3 種不同的數據框來存儲產品、性能和分類數據。 所有維度之間都保持外鍵關系。
我需要通過執行以下數學運算來更新性能中的成本列
performance['cost'] = performance['coulmn1']+sin(product['column3'])+2*Assortment['column2']
我需要對性能 dataframe 的每一行執行此操作。
請提出任何使計算更快的方法。 性能 dataframe 包含 100 萬條記錄。
我們可以使用任何其他方法而不是 dataframe 嗎?
一種方法是預先計算整個列的 sin function。 我為此使用了 100 萬條記錄,這對我來說非常快。
import pandas as pd
import math
import numpy as np
product = pd.DataFrame(columns=['col3', 'sincol3'])
product['col3'] = np.random.randn(1000000)
s = pd.Series(product['col3'])
product['sincol3'] = np.sin(s)
performance = pd.DataFrame(columns=['col1', 'cost'])
performance['col1'] = np.random.randn(1000000)
assortments = pd.DataFrame(columns=['col2'])
assortments['col2'] = np.random.randn(1000000)
performance['cost'] = performance['col1']+ product['sincol3'] + 2*assortments['col2']
print(performance)
它為您提供 output ,例如:
col1 cost
0 0.194011 -1.940931
1 0.535375 1.891468
評論后編輯:您必須了解表達式本身不需要花費很多時間來計算。 如果表達式是您在運行時唯一要做的事情(假設您的數據框已經有值)。 讓我們將一個示例與 50 次運行進行比較。
例子:
import pandas as pd
import math
import numpy as np
import time
def cal():
performance['cost'] = performance['col1']+ product['sincol3'] + 2*assortments['col2']
execution_time = []
product = pd.DataFrame(columns=['col3', 'sincol3'])
product['col3'] = np.random.randn(1000000)
s = pd.Series(product['col3'])
product['sincol3'] = np.sin(s)
performance = pd.DataFrame(columns=['col1', 'cost'])
performance['col1'] = np.random.randn(1000000)
assortments = pd.DataFrame(columns=['col2'])
assortments['col2'] = np.random.randn(1000000)
for i in range(0,50):
start_time = time.time()
cal()
execution_time.append(time.time() - start_time)
print('average time taken:\n')
print(np.mean(execution_time))
給我: average time taken: 0.15080997943878174
同時:
import pandas as pd
import math
import numpy as np
import time
def cal():
execution_time = []
product = pd.DataFrame(columns=['col3', 'sincol3'])
product['col3'] = np.random.randn(1000000)
s = pd.Series(product['col3'])
product['sincol3'] = np.sin(s)
performance = pd.DataFrame(columns=['col1', 'cost'])
performance['col1'] = np.random.randn(1000000)
assortments = pd.DataFrame(columns=['col2'])
assortments['col2'] = np.random.randn(1000000)
performance['cost'] = performance['col1']+ product['sincol3'] + 2*assortments['col2']
for i in range(0,50):
start_time = time.time()
cal()
execution_time.append(time.time() - start_time)
print('average time taken:\n')
print(np.mean(execution_time))
給我average time taken: 0.5624121456611447
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.