【问题标题】:pandas apply lambda multiple arguments no query different dataframes熊猫应用 lambda 多个参数不查询不同的数据帧
【发布时间】:2016-05-22 02:36:02
【问题描述】:

我注意到我的 question 以前的版本建议使用查询,但我有唯一的数据框,它们没有相同的列名。我想在没有 for 循环且仅使用 apply 函数的情况下编写此公式:

这里是初始化的变量。 mu=μ,其他变量如下:

mu=pd.DataFrame(0, index=['A','B','C'], columns=['x','y'])  
pij=pd.DataFrame(np.random.randn(500,3),columns=['A','B','C'])
X=pd.DataFrame(np.random.randn(500,2),columns=['x','y'])

接下来,我可以使用嵌套的 for 循环来解决这个问题

for j in range(len(mu)):
    for i in range(len(X)): 
        mu.ix[j,:]+=pij.ix[i,j]*X.ix[i,['x','y']]
    mu.ix[j,:]=(mu.ix[j,:])/(pij.ix[:,j].sum())

mu
          x         y
A  0.147804  0.169263
B -0.299590 -0.828494
C -0.199637  0.363423

我的问题是是否可以不使用嵌套的 for 循环,甚至删除一个 for 循环来解决这个问题。我做了一些微不足道的尝试,但无济于事。

即使是我最初的尝试也会导致多个 NaN。

【问题讨论】:

    标签: python pandas lambda dataframe apply


    【解决方案1】:

    您粘贴的代码表明您的意思是公式左侧 mu 上的索引为 j,所以我假设是这种情况。

    此外,由于您为示例生成了随机矩阵,我的结果将与您的结果不同,但我检查了您粘贴的代码与我生成的矩阵上的代码给出的结果相同。

    公式的RHS分子可以用适当的transposematrix multiplication计算:

    >>> num = pij.transpose().dot(X)
    >>> num
               x          y
    A -30.352924 -22.405490
    B  14.889298 -16.768464
    C -24.671337   9.092102
    

    分母就是summing over columns

    >>> denom = pij.sum()
    >>> denom
    A    23.460325
    B    20.106702
    C   -46.519167
    dtype: float64
    

    那么“师”就是element-wise division by column

    >>> num.divide(denom, axis='index')
              x         y
    A -1.293798 -0.955037
    B  0.740514 -0.833974
    C  0.530348 -0.195449
    

    【讨论】:

      【解决方案2】:

      我首先将pij 标准化,然后用 X 取内积。公式如下:

      mu = (pij / pij.sum()).T.dot(X)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-09-04
        • 1970-01-01
        • 2016-09-17
        • 2019-12-07
        • 2017-10-15
        • 1970-01-01
        • 2016-09-15
        • 2018-05-22
        相关资源
        最近更新 更多