【问题标题】:How to implement a dyadic product in a pandaic way如何以熊猫的方式实现二元乘积
【发布时间】:2023-03-16 14:15:01
【问题描述】:

我有以下数据框:

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 中总是至少有一个非 nan 条目,但可能有多个。我想构建一个新列作为 (non-nan(A) * (B)) 的向量的平均值(如果需要,考虑到 A 值的不安全性,这是一种插补) 这可以简单地实现

np.nanmean(dyadic, axis=0)
array([ 0.225,  1.125,  0.675,  0.225])

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

【问题讨论】:

标签: python pandas numpy matrix-multiplication


【解决方案1】:

又名,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 

【讨论】:

  • 也称为df[['A']].dot(df['B'].values[None, :])df.A.values[:, None].dot(df.B.values[None, :])
  • @Zero 谢谢,已添加。
  • 谢谢,我也尝试过使用 dot,但不知怎么就无法使用
【解决方案2】:

一种方式

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

【讨论】:

  • 查看我的答案以获得更快的替代方案 ;-)
  • @cᴏʟᴅsᴘᴇᴇᴅ 是的,我考虑过,因为他想要熊猫..哈哈
  • 你可能忘记了 pandas 有可以使用的pd.DataFrame.dot。所以dot 是熊猫。
猜你喜欢
  • 1970-01-01
  • 2014-11-10
  • 1970-01-01
  • 1970-01-01
  • 2023-04-08
  • 1970-01-01
  • 1970-01-01
  • 2021-07-22
  • 1970-01-01
相关资源
最近更新 更多