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

如何在Python中按分组的唯一值占比随机选取指定总数的行

Python实现按分组唯一ID占比随机选取指定行数的解决方案

我来帮你搞定这个数据处理需求,咱们一步步来实现:

原始数据集

首先是你提供的原始数据:

IDTeamColor
1ABlue
2BRed
2BGreen
3ABlue
6CRed
1BYellow
2BGreen
9ABlue
6CRed
1BYellow
9ABlue
1APurple

分组占比与行数分配

根据每个Team的唯一ID数量,咱们先算出占比和对应要选取的行数:总唯一ID数是3(A)+2(B)+1(C)=6,所以各分组的占比和行数如下:

TeamUnique IDsProportionNumber selected
A30.5004
B20.3333
C10.1671

Python代码实现

这里用pandas来处理最方便,代码如下:

import pandas as pd

# 1. 创建原始数据集的DataFrame
data = {
    'ID': [1, 2, 2, 3, 6, 1, 2, 9, 6, 1, 9, 1],
    'Team': ['A', 'B', 'B', 'A', 'C', 'B', 'B', 'A', 'C', 'B', 'A', 'A'],
    'Color': ['Blue', 'Red', 'Green', 'Blue', 'Red', 'Yellow', 'Green', 'Blue', 'Red', 'Yellow', 'Blue', 'Purple']
}
df = pd.DataFrame(data)

# 2. 计算每个Team的唯一ID数量
unique_id_counts = df.groupby('Team')['ID'].nunique()
total_unique_ids = unique_id_counts.sum()

# 3. 计算每个Team需要选取的行数(总选取数为8)
total_rows_to_select = 8
selection_counts = (unique_id_counts / total_unique_ids * total_rows_to_select).round().astype(int)

# 确保总选取数刚好是8(避免四舍五入误差)
if selection_counts.sum() != total_rows_to_select:
    diff = total_rows_to_select - selection_counts.sum()
    max_team = selection_counts.idxmax()
    selection_counts[max_team] += diff

# 4. 按分组随机选取对应行数(允许重复选行,replace=True)
selected_rows = []
for team, count in selection_counts.items():
    group = df[df['Team'] == team]
    sampled = group.sample(n=count, replace=True, random_state=42)  # random_state固定可复现结果
    selected_rows.append(sampled)

# 5. 合并结果并重置索引
final_df = pd.concat(selected_rows).reset_index(drop=True)

# 打印结果
print(final_df)

结果示例

运行代码后,你会得到类似这样的随机选取结果(因为是随机采样,每次结果可能略有不同,这里用random_state=42固定了随机种子保证可复现):

IDTeamColor
1ABlue
3ABlue
9ABlue
1APurple
2BGreen
2BRed
1BYellow
6CRed

关键说明

  • nunique():用来计算每个分组里ID的唯一值数量,这是咱们计算占比的基础
  • sample(replace=True):允许重复选取同一行,符合你“选取的行无需保证唯一性”的要求
  • random_state:固定随机种子可以让每次运行得到相同的结果,如果你想要每次都不同,去掉这个参数就行

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.27 18:32:39