gpt4 book ai didi

python - 如何使用来自另一个数据框的输入最佳地将函数应用于数据框的所有项目?

转载 作者:行者123 更新时间:2023-11-28 18:52:12 24 4
gpt4 key购买 nike

我是 Python 的新手,我目前正在努力用 Pandas 做一些简单的事情。我想对给定数据集的每个项目应用相同的函数,但使用时间相关参数。

我正在使用时间戳作为索引的 pandas DataFrame

假设:

a(i,j) is ith element in column j in a dataframe A (timestamp/index = i and column = j)

b(i) is the ith element in a dataframe B (with a single column)

我想计算:

c(i, j) = fct(a(i, j), b(i))

其中 fct 是一个有两个参数的函数 z = fct(x, y)

我写了一段代码可以正确地完成它,但它可能不是最优的(非常慢)。对于示例,我只使用了一个简单的函数 fct(但实际上它更复杂)

输入:

  • df_data:pandas.DataFrame 具有 index=timestamps 和多个列
  • df_parameter:pandas.DataFrame,其中 1 列包含时间相关参数

代码如下:

# p.concat is required as timestamps are not identical in df_data & df_parameters
import numpy as np
import pandas as p

temp = p.concat([df_data, df_parameter], join='inner', axis=1)
index = temp.index
np_data = temp[nacelleWindSpeeds.columns].values
np_parameter = temp[airDensity.columns].values

import math

def fct(x, y):
return math.pow(x, y)

def test(np_data, np_parameter):
np_result = np.empty(np_data.shape, dtype=float)
it = np.nditer(np_data, flags=['multi_index'])

while not it.finished:
np_result[it.multi_index] = fct(it[0].item(),
np_parameter[it.multi_index[0]][0])
it.iternext()

df_final=p.DataFrame(data=np_result, index=index)
return df_final

final=test(np_data, np_parameter)

final.to_csv(r'C:\temp\test.csv', sep=';')

这是一些示例数据:

df_data

01/03/2010 00:00  ;  9  ;  5  ;  7  
01/03/2010 00:10 ; 9 ; 1 ; 4
01/03/2010 00:20 ; 5 ; 3 ; 8
01/03/2010 00:30 ; 7 ; 7 ; 1
01/03/2010 00:40 ; 8 ; 2 ; 3
01/03/2010 00:50 ; 0 ; 3 ; 4
01/03/2010 01:00 ; 4 ; 3 ; 2
01/03/2010 01:10 ; 6 ; 2 ; 2
01/03/2010 01:20 ; 6 ; 8 ; 5
01/03/2010 01:30 ; 7 ; 7 ; 0

df_参数

01/03/2010 00:00  ;  2  
01/03/2010 00:10 ; 5
01/03/2010 00:20 ; 2
01/03/2010 00:30 ; 3
01/03/2010 00:40 ; 0
01/03/2010 00:50 ; 2
01/03/2010 01:00 ; 4
01/03/2010 01:10 ; 3
01/03/2010 01:20 ; 3
01/03/2010 01:30 ; 1

最终

01/03/2010 00:00  ;  81  ;  25  ;  49  
01/03/2010 00:10 ; 59049 ; 1 ; 1024
01/03/2010 00:20 ; 25 ; 9 ; 64
01/03/2010 00:30 ; 343 ; 343 ; 1
01/03/2010 00:40 ; 1 ; 1 ; 1
01/03/2010 00:50 ; 0 ; 9 ; 16
01/03/2010 01:00 ; 256 ; 81 ; 16
01/03/2010 01:10 ; 216 ; 8 ; 8
01/03/2010 01:20 ; 216 ; 512 ; 125
01/03/2010 01:30 ; 7 ; 7 ; 0

非常感谢您的帮助,

帕特里克

最佳答案

不知道这是否是最佳方式,但这更简单并且应该更有效,因为它使用矢量化函数进行计算:

def func(x, y):
return x ** y

data = pd.read_csv('data.dat', sep=';', index_col=0, parse_dates=True,
header=None, names='abc')
para = pd.read_csv('parameter.dat', sep=';', index_col=0, parse_dates=True,
header=None, names=['para'])

for col in data:
data['%s_result' % col] = func(data[col], para.para)

print data

结果

                     a  b  c  a_result  b_result  c_result
2010-01-03 00:00:00 9 5 7 81 25 49
2010-01-03 00:10:00 9 1 4 59049 1 1024
2010-01-03 00:20:00 5 3 8 25 9 64
2010-01-03 00:30:00 7 7 1 343 343 1
2010-01-03 00:40:00 8 2 3 1 1 1
2010-01-03 00:50:00 0 3 4 0 9 16
2010-01-03 01:00:00 4 3 2 256 81 16
2010-01-03 01:10:00 6 2 2 216 8 8
2010-01-03 01:20:00 6 8 5 216 512 125
2010-01-03 01:30:00 7 7 0 7 7 0

如果您的实际函数更复杂,您甚至应该尝试对其进行矢量化或使用 numpy.vectorize()作为下一个最佳解决方案。

关于python - 如何使用来自另一个数据框的输入最佳地将函数应用于数据框的所有项目?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10797734/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com