python - 包含字符串的多个 DataFrame 的逐项加权平均值
问题描述
我对 Python 和 Pandas 比较陌生。
我有多个相同格式的 DataFrame,包含浮点和字符串值(在每一列和每一行中)。字符串/浮点项的位置在 DataFrame 中是相同的。我想对具有固定权重的几个 DataFrame 中的各个项目进行加权平均。
例子:
df1 = pd.DataFrame([['A', '1', '2', 'B'], ['3', '4', 'C', '5'], ['6', 'D', 'E', '7']], columns=['Col1', 'Col2', 'Col3', 'Col4'])
df2 = pd.DataFrame([['A', '11', '12', 'B'], ['13', '14', 'C', '15'], ['16', 'D', 'E', '17']], columns=['Col1', 'Col2', 'Col3', 'Col4'])
df3 = pd.DataFrame([['A', '21', '22', 'B'], ['23', '24', 'C', '25'], ['26', 'D', 'E', '27']], columns=['Col1', 'Col2', 'Col3', 'Col4'])
df1
Col1 Col2 Col3 Col4
0 A 1 2 B
1 3 4 C 5
2 6 D E 7
df2
Col1 Col2 Col3 Col4
0 A 11 12 B
1 13 14 C 15
2 16 D E 17
df3
Col1 Col2 Col3 Col4
0 A 21 22 B
1 23 24 C 25
2 26 D E 27
以每个 df 中的第一个项目的权重 0.2、0.3 和 0.5 为例(稍后,每个项目都应该获得特定的权重),我想实现以下目标:
df4
Col1 Col2 Col3 Col4
0 A 14 15 B
1 16 17 C 18
2 19 D E 20
第一项是0.2*1+0.3*11+0.5*21=14
,第二项是0.2*2+0.3*12+0.5*22=15
,依此类推。
上面生成的模板只是为了便于理解跨模板的预期平均。实际上,我想将总和为 1 的不同权重应用于 DataFrame 中的每个项目。所以下一个项目不会再次收到权重 0.2、0.3 和 0.5,而是不同的权重(例如 0.1、0.8 和 0.1)。
我不确定如何做到这一点,并且无法在逐项平均上找到任何东西,因为字符串值的难度增加)
DataFrame 非常大,因此非常感谢一种有效的方法。
非常感谢!
编辑:
更清楚地说:我想对 DataFrame 中的每个项目应用不同的权重。因此,我需要对 DataFrames 进行逐项平均。因此,虽然每个 df 中的第一项将使用权重 0.2、0.3 和 0.5 进行平均,但下一项将获得不同的权重(例如 0.1、0.8 和 0.1)。在上面的示例中,使用权重 0.1、0.8 和 0.1 作为示例,结果 df 的第二项应该是0.1*2+0.8*12+0.1*22=12
。下一个项目将再次获得总和为 1 的不同权重。
最后,我想对 DataFrame 中的每个项目应用随机权重(例如使用 random.uniform),该权重加到 1。
解决方案
尝试:
weights = [0.2, 0.3, 0.5]
df1x = df1.apply(lambda x: pd.to_numeric(x, errors="coerce"))
df2x = df2.apply(lambda x: pd.to_numeric(x, errors="coerce"))
df3x = df3.apply(lambda x: pd.to_numeric(x, errors="coerce"))
out = (df1x * weights[0] + df2x * weights[1] + df3x * weights[2]).fillna(df1)
print(out)
印刷:
Col1 Col2 Col3 Col4
0 A 14.0 15.0 B
1 16.0 17.0 C 18.0
2 19.0 D E 20.0