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

多循环条件下Pandas DataFrame子集筛选及跨表用户子集获取咨询

嗨,我来帮你搞定这个需求!看起来你需要为每个用户筛选出符合特定条件的相似用户子集对吧?咱们一步步来实现:

步骤1:合并两个DataFrame

首先得把用户的调查数据和画像特征整合到一起,这样后续筛选时不用来回切换两个表。用Pandas的merge方法就能轻松搞定,Userid是咱们的关联主键:

import pandas as pd

# 假设你的调查数据DataFrame叫survey_df,画像数据叫profile_df
merged_df = pd.merge(survey_df, profile_df, on='Userid', how='inner')

这里用inner合并是为了只保留两个表中都存在的用户,避免出现缺失画像或调查数据的无效记录。

步骤2:定义多条件筛选规则

接下来要明确“符合多条件”的具体标准——结合你给出的字段,咱们可以先设定一套基础规则(你可以根据实际需求调整):

  • 收入层级与目标用户相同,或上下相差1级(比如目标用户是3,允许2、3、4,同时不能超出1-6的范围)
  • 保险知识水平与目标用户相同,或上下相差1级(同样限制在1-6级内)
  • 必须排除用户自身(不能把自己算进相似子集里)

如果后续还要加入其他画像特征的条件(比如年龄范围、学历匹配等),直接在规则里加就行。

步骤3:遍历用户获取相似子集

我写了一个可复用的函数,输入目标用户ID和合并后的DataFrame,就能返回符合条件的用户子集。然后遍历第一个DataFrame的每个用户,调用这个函数即可:

def get_similar_users(target_userid, merged_df):
    # 先取出目标用户的所有特征
    target_user = merged_df[merged_df['Userid'] == target_userid].iloc[0]
    
    # 处理收入层级的筛选条件(避免超出1-6的范围)
    income_min = max(1, target_user['incomebracket'] - 1)
    income_max = min(6, target_user['incomebracket'] + 1)
    income_condition = merged_df['incomebracket'].between(income_min, income_max)
    
    # 处理保险知识水平的筛选条件
    insurance_min = max(1, target_user['insurance-knowledge'] - 1)
    insurance_max = min(6, target_user['insurance-knowledge'] + 1)
    insurance_condition = merged_df['insurance-knowledge'].between(insurance_min, insurance_max)
    
    # 排除用户自身的条件
    exclude_self = merged_df['Userid'] != target_userid
    
    # 组合所有条件,返回筛选后的子集
    final_condition = income_condition & insurance_condition & exclude_self
    return merged_df[final_condition]

# 遍历survey_df中的每个用户,获取对应的相似用户子集
for _, row in survey_df.iterrows():
    user_id = row['Userid']
    similar_users = get_similar_users(user_id, merged_df)
    # 这里可以根据需求对similar_users做后续操作,比如保存、分析等
    print(f"用户 {user_id} 的相似用户子集:")
    print(similar_users)
大数据量优化建议

如果你的用户数量特别多,上面的遍历方法可能会有点慢。可以提前按收入层级和保险知识水平分组,后续查询直接基于分组结果,效率会高很多:

# 提前按收入层级+保险知识水平分组,存储每组的用户ID列表
grouped = merged_df.groupby(['incomebracket', 'insurance-knowledge'])['Userid'].apply(list).reset_index()

def get_similar_users_fast(target_userid, merged_df, grouped):
    target_user = merged_df[merged_df['Userid'] == target_userid].iloc[0]
    target_income = target_user['incomebracket']
    target_insurance = target_user['insurance-knowledge']
    
    # 收集所有符合条件的分组组合
    valid_groups = []
    for income in range(max(1, target_income-1), min(6, target_income+1)+1):
        for insurance in range(max(1, target_insurance-1), min(6, target_insurance+1)+1):
            valid_groups.append((income, insurance))
    
    # 从分组中提取符合条件的用户ID,排除自身
    similar_user_ids = []
    for group in valid_groups:
        group_users = grouped[(grouped['incomebracket'] == group[0]) & (grouped['insurance-knowledge'] == group[1])]['Userid'].values[0]
        similar_user_ids.extend([uid for uid in group_users if uid != target_userid])
    
    # 返回对应的用户子集
    return merged_df[merged_df['Userid'].isin(similar_user_ids)]
额外提示
  • 确保两个DataFrame中的Userid格式一致(比如都是整数类型),避免合并失败
  • 如果要加入其他筛选条件(比如得分相近、学历相同),直接在final_condition里追加对应的逻辑即可,比如merged_df['education'] == target_user['education']
  • 如果需要更灵活的匹配规则,可以把条件参数化,比如允许用户自定义收入层级的差值范围

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 08:03:38