如何在Python中按分组的唯一值占比随机选取指定总数的行
Python实现按分组唯一ID占比随机选取指定行数的解决方案
我来帮你搞定这个数据处理需求,咱们一步步来实现:
原始数据集
首先是你提供的原始数据:
| ID | Team | Color |
|---|---|---|
| 1 | A | Blue |
| 2 | B | Red |
| 2 | B | Green |
| 3 | A | Blue |
| 6 | C | Red |
| 1 | B | Yellow |
| 2 | B | Green |
| 9 | A | Blue |
| 6 | C | Red |
| 1 | B | Yellow |
| 9 | A | Blue |
| 1 | A | Purple |
分组占比与行数分配
根据每个Team的唯一ID数量,咱们先算出占比和对应要选取的行数:总唯一ID数是3(A)+2(B)+1(C)=6,所以各分组的占比和行数如下:
| Team | Unique IDs | Proportion | Number selected |
|---|---|---|---|
| A | 3 | 0.500 | 4 |
| B | 2 | 0.333 | 3 |
| C | 1 | 0.167 | 1 |
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固定了随机种子保证可复现):
| ID | Team | Color |
|---|---|---|
| 1 | A | Blue |
| 3 | A | Blue |
| 9 | A | Blue |
| 1 | A | Purple |
| 2 | B | Green |
| 2 | B | Red |
| 1 | B | Yellow |
| 6 | C | Red |
关键说明
nunique():用来计算每个分组里ID的唯一值数量,这是咱们计算占比的基础sample(replace=True):允许重复选取同一行,符合你“选取的行无需保证唯一性”的要求random_state:固定随机种子可以让每次运行得到相同的结果,如果你想要每次都不同,去掉这个参数就行
内容的提问来源于stack exchange,提问作者brandooo23
相关产品推荐
相关产品推荐

