首页 > 解决方案 > 包含字符串的多个 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。

标签: pythonpandasdataframeweighted-average

解决方案


尝试:

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

推荐阅读