我有以下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只是这里最优雅的解决方案?
答案 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
然后,您可以在结果上调用mean
或nanmean
-
df[['A']].dot(df[['B']].values.T).mean(0)
0 0.225
1 1.125
2 0.675
3 0.225
dtype: float64