包含字符串的多个 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',['13','14','15'],['16','17']],'Col4'])
df3 = pd.DataFrame([['A','21','22',['23','24','25'],['26','27']],'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,依此类推。

上述生成的模板只是为了便于理解预期的跨模板。实际上,我想对 DataFrame 中的每个项目应用总和为 1 的不同权重。所以下一个项目不会再次获得 0.2、0.3 和 0.5 的权重,而是不同的(例如 0.1、0.8 和 0.1)。

我不知道如何实现这一点,并且无法在逐项平均中找到任何内容增加了字符串值的难度)

DataFrames 非常大,因此非常感谢一种有效的方法

非常感谢!

编辑:

为了更清楚地说明:我想对 DataFrame 中的每个项目应用不同的权重。因此,我需要对 DataFrame 进行逐项平均。因此,虽然每个 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。

最后,我想应用随机权重 (例如,使用 random.uniform)将 DataFrame 中的每个项目加到 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