You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Pandas:基于双向列匹配条件计算指定列的平均值

解决DataFrame的交叉平均值计算问题

核心思路

先预计算两个映射表:

  • 每个值在item-2列中出现时,对应Buy和Sell的平均值(用于匹配每行的item-1)
  • 每个值在item-1列中出现时,对应Buy和Sell的平均值(用于匹配每行的item-2)
    再通过合并操作,将对应平均值映射到原DataFrame的每一行。

代码实现

import pandas as pd

# 构造示例数据(可替换为你的实际数据)
data = {
    'item-1': ['A', 'B', 'C', 'D', 'E', 'C', 'F'],
    'item-2': ['C', 'D', 'A', 'B', 'A', 'E', 'A'],
    'Buy': [10, 15, 5, 8, 12, 7, 9],
    'Sell': [20, 25, 15, 18, 22, 17, 19]
}
df = pd.DataFrame(data)

# 计算:item-2列中各值对应的Buy/Sell平均值(对应avg-item-1-buy/sell)
item2_avg = df.groupby('item-2')[['Buy', 'Sell']].mean().rename(
    columns={'Buy': 'avg-item-1-buy', 'Sell': 'avg-item-1-sell'}
)

# 计算:item-1列中各值对应的Buy/Sell平均值(对应avg-item-2-buy/sell)
item1_avg = df.groupby('item-1')[['Buy', 'Sell']].mean().rename(
    columns={'Buy': 'avg-item-2-buy', 'Sell': 'avg-item-2-sell'}
)

# 合并到原DataFrame
df = df.merge(item2_avg, left_on='item-1', right_index=True, how='left')
df = df.merge(item1_avg, left_on='item-2', right_index=True, how='left')

print(df)

结果说明

运行后会得到包含新增列的DataFrame:

  • avg-item-1-buy:当前行item-1值在item-2列中所有对应行的Buy平均值
  • avg-item-1-sell:当前行item-1值在item-2列中所有对应行的Sell平均值
  • avg-item-2-buy:当前行item-2值在item-1列中所有对应行的Buy平均值
  • avg-item-2-sell:当前行item-2值在item-1列中所有对应行的Sell平均值

比如示例中第一行:

  • item-1为A,对应item-2列中索引2、4、6的行,Buy平均值为(5+12+9)/3≈8.67
  • item-2为C,对应item-1列中索引2、5的行,Buy平均值为(5+7)/2=6

内容的提问来源于stack exchange,提问作者min2bro

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 00:54:33