如何基于Pandas GroupBy分布在两个DataFrame间匹配客户ID?
基于参考DataFrame分组分布提取目标客户ID
完全可以实现需求,核心思路是先提取参考DataFrame(dataframe_1)的分组计数规则,再对目标DataFrame(dataframe_2)的对应分组按规则采样唯一ID。以下是具体实现步骤:
1. 提取参考分组计数规则
先从dataframe_1中获取每个gender-age-region组合需要的客户数量:
import pandas as pd # 初始化原始数据 dataframe_1 = pd.DataFrame({'customer_id': ['id1', 'id2', 'id3', 'id4', 'id5', 'id6'], 'gender': ['M', 'M', 'F', 'F', 'F', 'F'], 'age': ['18-25', '25-40', '18-25', '18-25', '60+', '18-25'], 'region': ['America', 'Africa', 'America', 'Asia', 'Europe', 'Asia']}) dataframe_2 = pd.DataFrame({'customer_id': ['id11', 'id12', 'id13', 'id14', 'id15', 'id16', 'id17', 'id18', 'id19', 'id20', 'id21'], 'gender': ['M', 'M', 'F', 'F', 'F', 'M', 'M', 'M', 'F', 'M', 'F'], 'age': ['18-25', '25-40', '18-25', '18-25', '60+', '18-25', '25-40', '60+', '18-25', '60+', '18-25'], 'region': ['America', 'Africa', 'America', 'Asia', 'Europe', 'Europe', 'Africa', 'Australia', 'Asia', 'Europe', 'Asia']}) # 生成分组计数规则表 group_counts = dataframe_1.groupby(['gender', 'age', 'region'])['customer_id'].count().reset_index(name='required_count')
执行后group_counts就是你需要的分布规则:
gender age region required_count 0 F 18-25 America 1 1 F 18-25 Asia 2 2 F 60+ Europe 1 3 M 18-25 America 1 4 M 25-40 Africa 1
2. 对目标DataFrame按规则采样
定义分组采样函数,对dataframe_2的每个分组提取对应数量的唯一customer_id:
def sample_group(group): # 获取当前分组对应的需求数量 req_count = group_counts.loc[ (group_counts['gender'] == group.name[0]) & (group_counts['age'] == group.name[1]) & (group_counts['region'] == group.name[2]), 'required_count' ].values[0] # 按需求数量随机采样(random_state固定可保证结果复现) return group.sample(n=req_count, random_state=42) # 执行分组采样 sampled_customers = dataframe_2.groupby(['gender', 'age', 'region']).apply(sample_group).reset_index(drop=True)
3. 查看结果
打印sampled_customers就能得到符合分布的客户列表:
customer_id gender age region 0 id13 F 18-25 America 1 id14 F 18-25 Asia 2 id21 F 18-25 Asia 3 id15 F 60+ Europe 4 id11 M 18-25 America 5 id12 M 25-40 Africa
注意事项
- 如果dataframe_2中某个分组的客户数量小于需求数量,代码会抛出错误,可根据实际情况添加异常处理(比如跳过该分组或采样全部可用ID)。
- 若不需要固定采样结果,可移除
random_state=42参数。
内容的提问来源于stack exchange,提问作者frogseer
相关产品推荐
相关产品推荐

