如何用Pandas实现分组内行组合并计算对应系数?
分组内计算两两变量系数的解决方案
原始输入数据
import pandas as pd df = pd.DataFrame({ 'ID': [1,1,1,2,2], 'Country_code': ['US','GB','AU','US','CL'], 'V1': [0.4,0.6,0.4,0.5,0.4], 'V2': [1,2,3,2,2] })
期望输出
ID Country_code coefV1 coefV2 1 US-GB 0.66 0.5 1 US-AU 1 0.33 1 GB-AU 1.5 0.66 2 US-CL 1.25 1
解决方案
你尝试的中间扩展思路方向是对的,不过可以通过分组+两两组合生成的方式更直接实现需求。核心逻辑是对每个ID分组,生成组内所有国家的两两组合,再计算对应变量的比值:
- 导入
itertools.combinations工具生成两两国家组合 - 定义分组处理函数,遍历组合计算系数
- 合并所有分组结果并格式化输出
完整代码如下:
from itertools import combinations def process_group(group): # 生成当前分组内所有不重复的两两国家组合 country_pairs = combinations(group['Country_code'], 2) results = [] for pair in country_pairs: # 获取两个国家对应的行数据 row_a = group[group['Country_code'] == pair[0]].iloc[0] row_b = group[group['Country_code'] == pair[1]].iloc[0] # 计算系数:A国变量值 / B国变量值 coefV1 = row_a['V1'] / row_b['V1'] coefV2 = row_a['V2'] / row_b['V2'] # 整理结果行 results.append({ 'ID': row_a['ID'], 'Country_code': f"{pair[0]}-{pair[1]}", 'coefV1': round(coefV1, 2), 'coefV2': round(coefV2, 2) }) return pd.DataFrame(results) # 按ID分组处理,合并所有结果 final_df = df.groupby('ID').apply(process_group).reset_index(drop=True) print(final_df)
运行后输出与期望一致(注:若需去掉末尾无意义的0,可额外对数值做字符串格式化处理):
ID Country_code coefV1 coefV2 0 1 US-GB 0.66 0.50 1 1 US-AU 1.00 0.33 2 1 GB-AU 1.50 0.67 3 2 US-CL 1.25 1.00
内容的提问来源于stack exchange,提问作者Juanito
相关产品推荐
相关产品推荐

