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

如何遍历两个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'])

对应数据表:

ABC
A0.30.40.3
B0.20.30.5
C0.60.10.3

排列序列DataFrame代码与结构

items = ['A','A','A','B','B','C','C']
perms = permutations(items)
perm_df = pd.DataFrame(perms).drop_duplicates()

部分样本数据:

0123456
0AAABBCC
2AAABCBC
12AAACBBC

金额计算示例

  • 第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

解决方案

实现步骤

  1. 定义项目与价值的映射关系
  2. 编写自定义函数,按公式计算单条序列的总金额
  3. 将函数应用到排列序列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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 02:44:59