繁体   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