如何遍历两个Pandas DataFrame,计算排列序列总金额并追加至第二个DataFrame?
问题描述
现有两个Pandas DataFrame:
- 转移概率DataFrame(TP):记录A、B、C三个项目间的转移概率
- 排列序列DataFrame:存储包含3个A、2个B、2个C的所有唯一排列结果
各项目对应价值:A=10,B=5,C=1。需计算每个排列序列的总金额,公式如下:
金额 = 第0列项目价值 + Σ(当前项目价值 × 前一个项目到当前项目的转移概率)
转移概率DataFrame代码与结构
import pandas as pd import numpy as np from itertools import permutations probs = np.asarray([ [0.3,0.4,0.3], [0.2,0.3,0.5], [0.6,0.1,0.3]]) prob_df = pd.DataFrame(probs, index=['A', 'B', 'C'], columns=['A', 'B', 'C'])
对应数据表:
| A | B | C | |
|---|---|---|---|
| A | 0.3 | 0.4 | 0.3 |
| B | 0.2 | 0.3 | 0.5 |
| C | 0.6 | 0.1 | 0.3 |
排列序列DataFrame代码与结构
items = ['A','A','A','B','B','C','C'] perms = permutations(items) perm_df = pd.DataFrame(perms).drop_duplicates()
部分样本数据:
| 0 | 1 | 2 | 3 | 4 | 5 | 6 | |
|---|---|---|---|---|---|---|---|
| 0 | A | A | A | B | B | C | C |
| 2 | A | A | A | B | C | B | C |
| 12 | A | A | A | C | B | B | C |
金额计算示例
- 第0行序列(A,A,A,B,B,C,C):10 + 10×0.3 + 10×0.3 +5×0.4 +5×0.3 +1×0.5 +1×0.3 = 20.3
- 第12行序列(A,A,A,C,B,B,C):10 +10×0.3 +10×0.3 +1×0.3 +5×0.1 +5×0.3 +1×0.5 = 18.8
解决方案
实现步骤
- 定义项目与价值的映射关系
- 编写自定义函数,按公式计算单条序列的总金额
- 将函数应用到排列序列DataFrame的每一行,生成并追加金额列
完整代码
import pandas as pd import numpy as np from itertools import permutations # 1. 构建转移概率矩阵 probs = np.asarray([ [0.3,0.4,0.3], [0.2,0.3,0.5], [0.6,0.1,0.3]]) prob_df = pd.DataFrame(probs, index=['A', 'B', 'C'], columns=['A', 'B', 'C']) # 2. 生成唯一排列序列DataFrame items = ['A','A','A','B','B','C','C'] perms = permutations(items) perm_df = pd.DataFrame(perms).drop_duplicates().reset_index(drop=True) # 3. 项目价值映射 value_map = {'A': 10, 'B': 5, 'C': 1} # 4. 计算单条序列的总金额 def compute_total_amount(row): # 初始金额为第一个元素的价值 total = value_map[row[0]] # 遍历后续元素,累加转移贡献 for idx in range(1, len(row)): prev_item = row[idx-1] curr_item = row[idx] trans_prob = prob_df.loc[prev_item, curr_item] total += value_map[curr_item] * trans_prob return total # 5. 应用函数并追加金额列 perm_df['金额'] = perm_df.apply(compute_total_amount, axis=1) # 验证示例行结果 print("示例行计算结果:") print(perm_df.loc[[0, 12], :])
输出验证
运行代码后,示例行的输出结果如下:
示例行计算结果: 0 1 2 3 4 5 6 金额 0 A A A B B C C 20.3 12 A A A C B B C 18.8
与预期计算值完全匹配。
内容的提问来源于stack exchange,提问作者DaCard
相关产品推荐
相关产品推荐

