首页 > 解决方案 > 多个数据帧的加权平均值

问题描述

我有几个相同尺寸的数据框,比如 df1 和 df2。

我想创建第三个数据框,比如 avg_df,它是 df1 和 df2 中各自值的加权平均值。假设我想用因子 2 加权 df1 和因子 1 加权 df2。

我还有另一个问题,因为某些列填充了字符串(但跨数据帧相同)。但是我在平均时不知何故需要忽略那些......

一些示例代码:

df1 = pd.DataFrame([["hello", 2, 1], ["hello", 1, 1]], columns=["a", "b", "c"])
df2 = pd.DataFrame([["hello", 2, 2], ["hello", 1, 1]], columns=["a", "b", "c"])

手动输入结果将是这样的(显然不是一个可行的解决方案,只是为了有产生所需输出的示例代码):

df3 = pd.DataFrame([["hello", (2*2+1*2)/3, (2*1+1*2)/3], ["hello", (2*1+1*1)/3, (2*1+1*1)/3]], columns=["a", "b", "c"])

我如何到达那里?

谢谢!!

标签: pythonpandasdataframe

解决方案


如果您真的想忽略字符串列,并且您确定两者df的形状相同,那么您可以这样做:

sel = ['b', 'c']  # numeric columns
df3 = df1.copy()
df3[sel] = 2/3 * df1[sel] + 1/3 * df2[sel]

根据您的数据,df3是:

       a    b         c
0  hello  2.0  1.333333
1  hello  1.0  1.000000

但是,在更一般的情况下,您可能有不同的大小,并且您的a列可能是相关的。这是一个例子:

df1 = pd.DataFrame([["hello", 2, 1], ["world", 1, 1]], columns=["a", "b", "c"])
df2 = pd.DataFrame([["world", 2, 2], ["hello", 1, 1]], columns=["a", "b", "c"])

(2/3 * df1.set_index('a').stack() +
 1/3 * df1.set_index('a').stack()).groupby(level=[0,1]).mean().unstack().reset_index()

# gives:
       a    b    c
0  hello  2.0  1.0
1  world  1.0  1.0

推荐阅读