将函数应用于datafram的元素

2024-05-29 10:59:34 发布

您现在位置:Python中文网/ 问答频道 /正文

假设我有以下数据帧df

              1      3
Scenario1  0.001   0.05
Scenario2  0.003   0.01
Scenario3  0.001   0.042
Scenario4  0.09    0.006
Scenario5  0.02    0.04

假设这些是利率和周期,我想计算年金。在

如果你不熟悉,我想用这个公式:

^{pr2}$

我怎样才能得到一个数据帧,在那里我已经计算了每个元素的函数值?在

我想做点什么

df.applymap(computeAnnuity)

给as r返回值(df中的每个元素),并以n形式给出数据帧的列名称(1和3)。但是我不知道如何在没有循环或循环的情况下有效地完成它。在

举例来说,你想要一个句点,比如说,句点。我想对dataframe中的每个元素都这样做(以一种高效和自动的方式:使用函数)。在


Tags: 数据函数元素df公式利率句点pr2
2条回答

对于性能(因为我们在这里寻找效率),我建议使用NumPy的方法,它使用^{}-

a = df.values
N = df.columns.values.astype(int)
df_out = pd.DataFrame((1-(1+a)**-N)/a, columns=df.columns, index=df.index)

样本输入,输出-

^{pr2}$

使用numexpr模块进一步增强

看看所涉及的计算,我们似乎在处理基于power和{}的操作。这些可以与^{}模块一起使用,以进一步提高性能。在

因此,我们有两种方法,比如-

import numexpr as ne

def numpy_app(df):
    a = df.values
    N = df.columns.values.astype(int)
    return pd.DataFrame((1-(1+a)**-N)/a, columns=df.columns, index=df.index)

def numpy_numexpr_app(df):
    a = df.values
    N = df.columns.values.astype(int)
    return pd.DataFrame(ne.evaluate('(1-(1+a)**-N)/a'), \
                            columns=df.columns, index=df.index)

对更大的数据集进行运行时测试-

In [75]: names = np.random.choice(10000,5000, replace=0)

In [76]: df = pd.DataFrame(np.random.rand(5000,5000), columns=list(names))

# @jezrael's solution using df.apply
In [77]: %timeit df.apply(lambda x: computeAnnuity(x, int(x.name)))
1 loops, best of 3: 3.54 s per loop

In [78]: %timeit numpy_app(df)
1 loops, best of 3: 1.99 s per loop

In [79]: %timeit numpy_numexpr_app(df)
1 loops, best of 3: 393 ms per loop

我想你需要apply

def computeAnnuity(r,n):
    return (1-(1+r)**-n)/r

df1 = df.apply(lambda x: computeAnnuity(x, x.name))
print (df1)
                  1         3
Scenario1  0.999001  2.723248
Scenario2  0.997009  2.940985
Scenario3  0.999001  2.764591
Scenario4  0.917431  2.964357
Scenario5  0.980392  2.775091

print ((1-(1+0.001)**-1)/0.001)
0.9990009990008542

相关问题 更多 >

    热门问题