如何在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
相关产品推荐
相关产品推荐

