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
相关产品推荐
相关产品推荐

