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

Python德州扑克练习:Pandas按不同列关联合并两个DataFrame

德州扑克牌组持有信息回填方案

基础说明

这是基于Pandas实现的德州扑克场景数据处理需求,涉及两个核心数据表:

  • 玩家底牌表:索引为玩家ID,HC1、HC2列分别存储玩家两张底牌对应的全局卡牌编号
  • 完整牌组表:索引为CardN(即全局卡牌编号,取值1-52),自带花色、牌点、抽中概率字段,其中HC1、HC2列为待填充字段,需要填入持有对应卡牌的玩家ID

样例数据结构如下:

# 玩家底牌表样例
       HC1 HC2
Player
1       51  46
2       48  28
3       14   2
4       41  12
5        5  38
6       52  30
7       32  35
8       18  15
9       39  10

# 完整牌组表样例
      Seed  Value      Prob HC1 HC2 Table
CardN
1        h      1  0.019231
2        h      2  0.019231
3        h      3  0.019231
...
51       s     12  0.019231
52       s     13  0.019231

匹配规则

将玩家底牌表中HC1、HC2列存储的卡牌编号,和牌组表的CardN索引做关联:如果某张卡牌是某个玩家的第一张底牌(即出现在玩家表的HC1列),就在牌组表对应卡牌行的HC1列填入该玩家ID;如果是玩家的第二张底牌,就在牌组表对应行的HC2列填入该玩家ID,未被玩家持有的公共牌对应字段留空即可。

实现代码

核心思路是先把宽格式的玩家底牌表转成长表,生成「卡牌编号-持有玩家-底牌位置」的映射字典,再按索引快速回填,比多表merge逻辑更简洁、执行效率更高:

import pandas as pd

# 第一步:转换玩家底牌表结构,生成卡牌和持有信息的对应关系
card_hold_map = player_df.melt(
    value_vars=['HC1', 'HC2'],
    var_name='hold_pos',
    value_name='card_id',
    ignore_index=False
).reset_index()

# 第二步:按底牌位置分别回填到牌组表对应列
for pos in ['HC1', 'HC2']:
    # 生成当前位置的 卡牌编号:玩家ID 映射字典
    pos_mapping = card_hold_map[card_hold_map['hold_pos'] == pos]\
        .set_index('card_id')['Player'].to_dict()
    # 按牌组表的CardN索引匹配映射完成填充
    deck_df[pos] = deck_df.index.map(pos_mapping)

效果验证

填充完成后可以对照样例数据抽查:

  • CardN=51的卡牌是玩家1的第一张底牌,对应行HC1列值为1
  • CardN=46的卡牌是玩家1的第二张底牌,对应行HC2列值为1
  • CardN=28的卡牌是玩家2的第二张底牌,对应行HC2列值为2
    所有匹配关系完全符合预期。

内容的提问来源于stack exchange,提问作者antobzzll

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 16:57:23