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

如何用Pandas的Groupby、转置或Unstack实现赛事选手数据重构

当然可以用Pandas实现这个需求!

我来给你一步步演示具体的操作方法,先从模拟你的原始数据开始,再逐步处理得到你想要的结果。

1. 先模拟你的原始DataFrame结构

首先,我们先创建一个和你描述一致的示例数据,包含日期、EventName和Race_Number:

import pandas as pd
import numpy as np

# 模拟原始数据
raw_data = {
    'Date': pd.date_range(start='2024-01-01', periods=6, freq='D').repeat(2),
    'EventName': ['春季赛事', '春季赛事']*3 + ['夏季赛事', '夏季赛事']*3,
    'Race_Number': ['Race 1', 'Race 2']*6
}

df_raw = pd.DataFrame(raw_data)
print("原始数据:")
print(df_raw.head(6))

这段代码会生成一个包含不同日期、赛事名称和赛道编号的DataFrame,和你描述的结构一致。

2. 实现每个赛事生成不同数量的参赛选手

核心思路是:按Date、EventName、Race_Number进行分组,然后给每个分组生成不同数量的参赛选手记录。我们可以用随机数来控制每个赛事的参赛人数(也可以根据你的需求手动指定)。

下面是具体的代码实现:

# 定义一个函数,给每个分组生成指定数量的参赛选手
def generate_racers(group):
    # 随机生成参赛人数(这里设置在5-15之间,你可以根据需求调整)
    racer_count = np.random.randint(5, 16)
    # 生成选手ID和姓名(示例用编号代替,你可以替换成真实数据)
    racers = pd.DataFrame({
        'Racer_ID': [f'R_{i+1}' for i in range(racer_count)],
        'Racer_Name': [f'选手_{i+1}' for i in range(racer_count)]
    })
    # 将分组的原始信息合并到选手数据中
    return pd.concat([group.reset_index(drop=True)]*racer_count, ignore_index=True).join(racers)

# 按赛事维度分组并应用函数
df_result = df_raw.groupby(['Date', 'EventName', 'Race_Number'], group_keys=False).apply(generate_racers)

print("\n处理后的结果(部分示例):")
print(df_result.sample(10))

3. 关键说明

  • 分组逻辑:通过groupby(['Date', 'EventName', 'Race_Number'])确保每个独立的赛事(日期+赛事名+赛道号)作为一个单独的分组
  • 参赛人数控制:用np.random.randint(5,16)随机生成5到15之间的参赛人数,你也可以改成手动指定的规则(比如给某些赛事固定人数)
  • 选手信息:示例中生成了简单的选手ID和姓名,你可以替换成实际的选手数据,或者从其他数据源导入

这样处理后,每个赛事的参赛选手数量就会各不相同,完全符合你的需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 07:52:01