pandas lambda函数中的SciPyNorm.cdf()返回数组而不是一个观察值

ssgvzors  于 2023-05-05  发布在  其他
关注(0)|答案(1)|浏览(141)

我继承了一个VBA代码,我想将其转换为Python。
考虑一个suvrival矩阵,其中:

  • 每一行都是不同的产品
  • 每列表示产品的年龄

我想创建一个零的生存矩阵,然后在其中应用正态分布(age-life_exp)/sd,其中age是列的编号。

结果:我的DF lifeleft_2中的数字本身是好的,但不是在正确的位置,结果的维度不好,lifeleft_2的列索引被破坏。
问题:如何让SciPy返回每个“观察”的结果,而不是每个观察中的整个数组?

import pandas as pd
    import numpy as np
    from scipy.stats import norm

    df = pd.DataFrame({'qty'      : [20,  30, 40],
                       'price'    : [100, 50, 20],
                       'life_exp' : [5,   4,  3]})
    df['sd'] = df['life_exp'] / 4

    nrows = df.shape[0]
    ncols = df['life_exp'].max()*2 + 1    # "+1" because 0 = equals the past

    # Survival matrix of zeros where column index = age, used for the normal distribution --> (age-life_exp) / sd
    lifeleft = pd.DataFrame(np.zeros((nrows, ncols)))
    l_cols   = lifeleft.columns

Lifeleft

# --->  PROBLEM IS HERE  <---
    lifeleft_2 = lifeleft.apply(lambda x: 1 - norm.cdf((col-df['life_exp']) / df['sd']) for col in l_cols)

    display(lifeleft_2)

Lifeleft_2

db2dz4w8

db2dz4w81#

life_left = pd.DataFrame(1 - norm.cdf([(c - df['life_exp']) / df['sd'] for c in range(ncols)])).T

相关问题