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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 04:55:32