Python Pandas合并两表关联系数数组计算生成新表的实现方法
实现步骤与代码
你可以按以下几步完成需求:
- 先将两个DataFrame按
cluster字段关联 - 将关联后的结果和系数数组做笛卡尔积展开
- 按公式计算目标字段,调整字段名得到最终结果
完整可运行代码如下:
import pandas as pd import numpy as np # 构造测试数据 data1 = [[1, 2000], [2, 3000]] df_players = pd.DataFrame(data1, columns = ['cluster', 'users']) data2 = [[1, 2], [2, 4]] df_multiplyer = pd.DataFrame(data2, columns = ['cluster', 'multiplyer']) coef = np.arange(.05, 0.16, 0.05) # 第一步:关联两个表 df_merge = df_players.merge(df_multiplyer, on='cluster') # 第二步:和系数数组做笛卡尔积 # 先把系数转成DataFrame df_coef = pd.DataFrame(coef, columns=['coeffs']) # pandas 1.2.0+ 支持直接用cross参数做笛卡尔积 df_result = df_merge.merge(df_coef, how='cross') # 第三步:调整字段名、计算目标字段 df_result = df_result.rename(columns={'users': 'num_users'}) df_result['calculated_field'] = df_result['num_users'] * df_result['multiplyer'] * df_result['coeffs'] # 输出结果 print(df_result)
运行后得到的结果和期望完全一致:
| cluster | num_users | multiplyer | coeffs | calculated_field |
|---|---|---|---|---|
| 1 | 2000 | 2 | 0.05 | 200.0 |
| 1 | 2000 | 2 | 0.10 | 400.0 |
| 1 | 2000 | 2 | 0.15 | 600.0 |
| 2 | 3000 | 4 | 0.05 | 600.0 |
| 2 | 3000 | 4 | 0.10 | 1200.0 |
| 2 | 3000 | 4 | 0.15 | 1800.0 |
如果你使用的pandas版本低于1.2.0不支持cross merge,可以用临时key的兼容写法替换笛卡尔积步骤:
# 低版本pandas兼容实现笛卡尔积 df_merge['tmp_key'] = 0 df_coef['tmp_key'] = 0 df_result = df_merge.merge(df_coef, on='tmp_key').drop('tmp_key', axis=1)
逻辑完全一致,通过相同的临时字段关联实现笛卡尔积效果。
内容的提问来源于stack exchange,提问作者Smasell
相关产品推荐
相关产品推荐

