python - 多个数据帧的加权平均值
问题描述
我有几个相同尺寸的数据框,比如 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"])
我如何到达那里?
谢谢!!
解决方案
如果您真的想忽略字符串列,并且您确定两者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
推荐阅读
- mysql - 同一表上的插入前和更新后触发器无法正常工作
- javascript - 无法使用 ng serve --open 提供 Angular 应用程序
- javascript - 无法使用 javascript 将 textarea 的值传递给 PHP 脚本 ECHO
- postgresql - 无法从远程数据库连接将数据插入到 postgres 表中
- python - 如何识别 css 选择器 ::before 在 selenium 中不起作用
- java - Kafka客户端有时会无意义地发送元数据请求吗?
- list - 如何从列表中的子列表中删除括号?
- powershell - 增加文本文件中包含的版本号
- android - java.lang.Long 无法转换为 java.lang.String android studio settext
- github - 如何在 github 操作中设置命令行参数?