问题描述
我对 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