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

使用np.random.choice从DataFrame随机选记录时字段不匹配问题求助

解决DataFrame分组后随机选取整行记录的字段关联问题

问题原因

你当前使用的df.groupby(['id','yr'],as_index=False).agg(np.random.choice)存在逻辑问题:agg(np.random.choice)会对分组内的每个字段独立执行随机选择——比如calories列从分组的calories值里挑一个,Duration列从分组的Duration值里挑一个,两者完全不关联,自然会出现同一分组下字段来自不同原行的情况。

高效解决方案(适配1700万行大数据量)

针对大数据量场景,推荐两种能保留整行字段关联的高效方法:

方法1:使用pandas原生sample方法(推荐)

sample是pandas专门为随机采样设计的方法,底层做了性能优化,能直接对每个分组选取完整行,完美保留字段关联:

import pandas as pd
import numpy as np

data = {
  "calories":[420,380,390,500,200,100],
  "Duration":[50,40,45,600,450,210],
  "Id":[1,1,2,3,2,3],
  "Yr":[2003,2003,2009,2003,2012,2003],
  "Mth":[3,6,9,12,3,6],
}
df = pd.DataFrame(data)  # 修正拼写错误:pd.DataFrame而非PD.dataframe

# 每个分组随机选取1行,replace=False表示不重复采样(分组仅1行时自动保留)
df2 = df.groupby(['Id', 'Yr'], as_index=False).sample(n=1, replace=False)

方法2:通过索引随机选择整行

如果坚持使用np.random.choice,可以先随机选择分组内的行索引,再通过索引提取整行,确保字段关联:

def pick_random_row(group):
    # 随机选取分组内的一个行索引
    selected_idx = np.random.choice(group.index)
    return group.loc[selected_idx]

df2 = df.groupby(['Id', 'Yr'], as_index=False).apply(pick_random_row)

额外注意事项

  • 修正代码中的拼写错误:PD.dataframe需改为pd.DataFrame(pandas的类名首字母大写,方法/属性小写)
  • 若分组内需要允许重复选取同一行,可将sample方法的replace参数设为True

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 19:00:53