pandas 应用 lambda 多参数不查询不同的数据帧

pandas apply lambda multiple arguments no query different dataframes

我注意到我的 以前的版本建议使用查询,但我有唯一的数据框,它们没有相同的列名。我想在没有 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。

您粘贴的代码表明您的意思是公式左侧的 mu 索引为 j,因此我假设情况就是如此。

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

公式右手边的分子可以用合适的transpose and matrix 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

那么"division"就是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

我先规范化 pij,然后用 X 取内积。公式如下:

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