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

Python中如何对分组DataFrame随机排序并按玩家ID拆分训练测试集

解决步骤

1. 按player_id分组随机排序

要让每个玩家的两行数据保持关联,同时整体随机排列玩家顺序,可按以下方式实现:

import pandas as pd
import numpy as np

df = pd.DataFrame({
               "player_id":[1,1,2,2,3,3,4,4,5,5,6,6],
               "year"     :[1,2,1,2,1,2,1,2,1,2,1,2],
               "overall"  :[20,16,7,3,8,80,20,12,9,3,2,1]})

# 提取唯一玩家ID并打乱顺序
shuffled_players = np.random.permutation(df['player_id'].unique())
# 按打乱后的玩家顺序重新排列整个DataFrame
df_shuffled = df.set_index('player_id').loc[shuffled_players].reset_index()

最终df_shuffled会保持每个玩家的两行数据绑定,且玩家整体顺序随机。

2. 按80-20比例拆分训练集和测试集(无共享player_id)

核心是先对玩家ID做分层拆分,再筛选对应数据:

# 获取所有唯一玩家ID
all_players = df['player_id'].unique()
# 计算训练集玩家数量(取整)
train_player_count = int(len(all_players) * 0.8)
# 随机选择训练集玩家
train_players = np.random.choice(all_players, size=train_player_count, replace=False)
# 拆分数据集
train_df = df_shuffled[df_shuffled['player_id'].isin(train_players)]
test_df = df_shuffled[~df_shuffled['player_id'].isin(train_players)]

这样拆分后的train_df和test_df不会有重复的玩家ID,比例接近80-20。

如果想简化成一步操作:

all_players = df['player_id'].unique()
np.random.shuffle(all_players)
split_point = int(len(all_players)*0.8)
train_players, test_players = all_players[:split_point], all_players[split_point:]

train_df = df[df['player_id'].isin(train_players)].set_index('player_id').loc[train_players].reset_index()
test_df = df[df['player_id'].isin(test_players)].set_index('player_id').loc[test_players].reset_index()

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 03:20:16