Pandas按Book与Bet分组拼接Odds列,每个Book对应一条记录
Pandas按book和bet分组生成定制化odds列
需求说明
处理Pandas DataFrame时,需要实现:
- 每个
book与bet的组合对应一条记录 odds列格式为:当前book对应的odds放在最前,同bet下其他book的odds用/依次拼接
示例数据
原始DataFrame:
import pandas as pd df = pd.DataFrame({ 'book': ['A', 'A', 'B', 'B', 'C', 'C'], 'bet': ['X', 'Y', 'X', 'Y', 'X', 'Y'], 'odds': [1.5, 2.0, 1.6, 2.1, 1.7, 2.2] })
期望输出
book bet odds 0 A X 1.5/1.6/1.7 1 A Y 2.0/2.1/2.2 2 B X 1.6/1.5/1.7 3 B Y 2.1/2.0/2.2 4 C X 1.7/1.5/1.6 5 C Y 2.2/2.0/2.1
解决方案
方法1:构建映射后逐行处理(逻辑清晰)
先为每个bet建立book与odds的映射关系,再针对每条记录重组odds字符串:
# 生成每个bet对应的book-odds字典 bet_odds_map = df.groupby('bet').apply( lambda group: group.set_index('book')['odds'].to_dict() ).to_dict() # 定义函数生成目标格式的odds def build_odds_str(row): current_odds = row['odds'] # 获取当前bet下所有book的odds,排除当前book后拼接 other_odds = [str(odds) for book, odds in bet_odds_map[row['bet']].items() if book != row['book']] return f"{current_odds}/{'/'.join(other_odds)}" # 应用函数生成新的odds列 df['odds'] = df.apply(build_odds_str, axis=1) print(df)
方法2:转宽表后批量处理(效率更高)
先将数据转成宽表(每个bet一行,各book的odds为列),再按book拆分重组:
# 转宽表,获取每个bet下所有book的odds wide_df = df.pivot(index='bet', columns='book', values='odds').reset_index() result = pd.DataFrame() # 遍历每个唯一book,生成对应记录 for book in df['book'].unique(): temp_df = df[df['book'] == book].copy() # 拼接当前book的odds和其他book的odds temp_df['odds'] = temp_df.apply( lambda row: f"{row['odds']}/{'/'.join(map(str, wide_df.loc[wide_df['bet'] == row['bet'], wide_df.columns != book].values[0]))}", axis=1 ) result = pd.concat([result, temp_df], ignore_index=True) # 按book和bet排序(可选) result = result.sort_values(['book', 'bet']).reset_index(drop=True) print(result)
说明
- 方法1逻辑直观,适合中小规模数据集;
- 方法2减少了循环次数,在大数据集上效率更优;
- 两种方法都能保证每个
book+bet组合对应一条记录,且odds列符合要求。
内容的提问来源于stack exchange,提问作者mattdonders
相关产品推荐
相关产品推荐

