簡體   English   中英

使用 pandas dataframe 進行多維計算

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM