如何以pandaic方式实现二元产品

时间:2018-01-09 17:16:39

标签: python pandas numpy matrix-multiplication

我有以下DataFrame:

df    
    A   B
0   2.5 0.1
1   NaN 0.5
2   NaN 0.3
3   2.0 0.1

我想将A中的每个非值与B列相乘。 这可以使用

来实现
dyadic = np.multiply(df['A'].values.reshape((1,4)).T, df['B'].values.reshape((1,4)))
dyadic

并返回向量的二元乘积

array([[ 0.25,  1.25,  0.75,  0.25],
       [  nan,   nan,   nan,   nan],
       [  nan,   nan,   nan,   nan],
       [ 0.2 ,  1.  ,  0.6 ,  0.2 ]])

是否可以直接从pandas构建这样的DataFrame?

此问题的背景:在groupby之后,每个组都包含一个具有上述结构的DataFrame。 A中始终至少有一个非纳入项,但可能有多个。我想构建一个新列作为(非纳(A)*(B))的向量的平均值(如果你想要的话,这是某种估算,考虑到A值的不安全性) 这可以通过

简单地实现
np.nanmean(dyadic, axis=0)
array([ 0.225,  1.125,  0.675,  0.225])

或者numpy只是这里最优雅的解决方案?

2 个答案:

答案 0 :(得分:4)

单程

pd.DataFrame(columns=df.B,index=df.A).apply(lambda x : x.name*x.index)
Out[93]: 
B      0.1   0.5   0.3   0.1
A                           
 2.5  0.25  1.25  0.75  0.25
NaN    NaN   NaN   NaN   NaN
NaN    NaN   NaN   NaN   NaN
 2.0  0.20  1.00  0.60  0.20

另一种方式(应该比apply快)

df[['B']].T.reindex(list(df[['B']])*len(df)).reset_index(drop=True).mul(df.A,0)
Out[106]: 
      0     1     2     3
0  0.25  1.25  0.75  0.25
1   NaN   NaN   NaN   NaN
2   NaN   NaN   NaN   NaN
3  0.20  1.00  0.60  0.20

答案 1 :(得分:4)

AKA,dot产品。

i = df[['A']].values
j = df[['B']].values.T

i.dot(j)

array([[ 0.25,  1.25,  0.75,  0.25],
       [  nan,   nan,   nan,   nan],
       [  nan,   nan,   nan,   nan],
       [ 0.2 ,  1.  ,  0.6 ,  0.2 ]])

如果您想将结果作为DataFrame,请执行此操作 -

df[['A']].dot(df[['B']].values.T)

或者,

df[['A']].dot(df['B'].values[None, :])  # thanks to Zero for the alt

      0     1     2     3
0  0.25  1.25  0.75  0.25
1   NaN   NaN   NaN   NaN
2   NaN   NaN   NaN   NaN
3  0.20  1.00  0.60  0.20

然后,您可以在结果上调用meannanmean -

df[['A']].dot(df[['B']].values.T).mean(0)

0    0.225
1    1.125
2    0.675
3    0.225
dtype: float64