我有两个Series,每个Series包含要在函数中使用的变量。我想对每个变量组合应用该函数,结果输出是计算值的DataFrame,索引将是一个系列的索引,列将是另一个系列的索引。
我已经尝试寻找类似问题的答案-我确定有一个答案,但是我不确定如何为搜索引擎描述它。
我已经通过使用for循环创建函数解决了问题,因此您可以理解逻辑。我想知道是否有一种更有效的操作而不使用for循环。
从我的阅读中,我正在想象列表理解与压缩列的某种组合以计算值,然后将其重塑为DataFrame,但我无法以这种方式解决。
这里是重现问题和当前解决方案的代码。
import pandas as pd
bands = pd.Series({'A': 5, 'B': 17, 'C': 9, 'D': 34}, name='band')
values = pd.Series({'Jan': 1, 'Feb': 1.02, 'Mar': 1.05, 'Apr': 1.12}, name='values')
# Here is an unused function as an example
myfunc = lambda x, y: x * (1 + 1/y)
def func1(values, bands):
# Initialise empty DataFrame
df = pd.DataFrame(index=bands.index,
columns=values.index)
for month, month_val in values.iteritems():
for band, band_val in bands.iteritems():
df.at[band, month] = band_val * (1/month_val - 1)
return df
outcome = func1(values, bands)
答案 0 :(得分:1)
您可以为此使用numpy.outer
:
import numpy as np
import pandas as pd
bands = pd.Series({'A': 5, 'B': 17, 'C': 9, 'D': 34}, name='band')
values = pd.Series({'Jan': 1, 'Feb': 1.02, 'Mar': 1.05, 'Apr': 1.12}, name='values')
outcome = pd.DataFrame(np.outer(bands, ((1 / values) - 1)),
index=bands.index,
columns=values.index)
[出]
Jan Feb Mar Apr
A 0.0 -0.098039 -0.238095 -0.535714
B 0.0 -0.333333 -0.809524 -1.821429
C 0.0 -0.176471 -0.428571 -0.964286
D 0.0 -0.666667 -1.619048 -3.642857
功能:
def myFunc(ser1, ser2):
result = pd.DataFrame(np.outer(ser1, ((1 / ser2) - 1)),
index=ser1.index,
columns=ser2.index)
return result
myFunc(bands, values)