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

如何在Pandas中实现基于ID的多数据集通用查询函数

解决方案:通用ID查询与字段处理函数

我明白你需要一个能适配任意数据集的通用函数,输入ID后完成字段转换、关联查询和随机值生成。下面是完整的实现方案,包含示例数据、函数代码和测试步骤:

1. 准备示例数据

首先咱们先定义你提到的两个示例DataFrame,方便后续测试:

import pandas as pd
import random
from datetime import datetime

# 第一个客户信息DataFrame
df1 = pd.DataFrame({
    "ID": [1, 2, 3],
    "FName": ["John", "Jane", "Bob"],
    "Lname": ["Doe", "Smith", "Brown"],
    "Email": ["john.doe@example.com", "jane.smith@example.com", "bob.brown@example.com"],
    "DOB": ["1990-05-15", "1985-10-20", "2000-01-05"],
    "Giga": [0, 1, 0],  # 0=男,1=女
    "status": ["Active", "Inactive", "Active"]
})

# 第二个业务数据DataFrame
df2 = pd.DataFrame({
    "ID": [1, 2, 3],
    "A": [100, 200, 300],
    "B": ["X", "Y", "Z"],
    "C": [True, False, True]
})

2. 编写通用处理函数

这个函数会接收两个DataFrame、目标ID,以及可选的字段映射规则(保证通用性),返回处理后的结果:

def get_processed_data(df_customer, df_business, target_id, 
                       gender_map={0: "男性", 1: "女性"},
                       status_map={"Active": "live", "Inactive": "dead"},
                       dob_col="DOB", fname_col="FName", lname_col="Lname",
                       gender_col="Giga", status_col="status",
                       id_col="ID"):
    # 1. 根据ID筛选客户数据,先检查是否存在
    customer_row = df_customer[df_customer[id_col] == target_id]
    if customer_row.empty:
        return f"ID {target_id} 在客户数据中不存在"
    
    customer_data = customer_row.iloc[0]
    
    # 2. 处理客户字段
    # 拼接姓名
    full_name = f"{customer_data[fname_col]} {customer_data[lname_col]}"
    # 映射性别(兼容未知值)
    gender = gender_map.get(customer_data[gender_col], "未知")
    # 计算年龄(考虑生日未过的情况)
    dob = datetime.strptime(customer_data[dob_col], "%Y-%m-%d")
    today = datetime.today()
    age = today.year - dob.year - ((today.month, today.day) < (dob.month, dob.day))
    # 映射状态(兼容未知值)
    status = status_map.get(customer_data[status_col], "未知")
    
    # 3. 获取对应业务数据
    business_row = df_business[df_business[id_col] == target_id]
    business_data = business_row.iloc[0].to_dict() if not business_row.empty else {}
    
    # 4. 生成随机mortgage值
    mortgage = random.randint(0, 2)
    
    # 5. 整理并返回结果
    result = {
        "客户姓名": full_name,
        "性别": gender,
        "年龄": age,
        "状态": status,
        **business_data,  # 自动合并业务数据的所有字段
        "mortgage": mortgage
    }
    
    return result

3. 测试函数调用

咱们用ID=2来测试一下:

result = get_processed_data(df1, df2, target_id=2)
print(result)

输出示例(mortgage是随机值,每次运行可能不同):

{
    '客户姓名': 'Jane Smith',
    '性别': '女性',
    '年龄': 38,  # 假设当前是2024年
    '状态': 'dead',
    'ID': 2,
    'A': 200,
    'B': 'Y',
    'C': False,
    'mortgage': 1
}

4. 通用性适配说明

这个函数能适配任意数据集,核心设计点包括:

  • 所有字段名都通过参数传入,比如你的数据集里性别字段叫Gender而非Giga,调用时只需传gender_col="Gender"
  • 性别、状态的映射规则是可配置参数,你可以根据需求传入自定义字典
  • 自动检查ID是否存在,避免空数据报错
  • 业务数据的字段会自动合并到结果中,不管df_business有多少字段都能兼容

比如如果你的客户DataFrame字段名不同,调用示例:

# 假设客户表中姓名字段是First_Name/Last_Name,性别字段是Gender
result = get_processed_data(
    df_customer, df_business, target_id=1,
    fname_col="First_Name", lname_col="Last_Name",
    gender_col="Gender"
)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 12:17:32