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.67item-2为C,对应item-1列中索引2、5的行,Buy平均值为(5+7)/2=6
内容的提问来源于stack exchange,提问作者min2bro
相关产品推荐
相关产品推荐

