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

如何基于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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 08:13:12