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

Pandas中匹配用户列值并合并符合条件值至新列的问题

问题:合并匹配的用户ID到新列

需求:对比df1的df1_user列与df2的df2_user列,若df1_user中包含多个df2_user的值,需将这些值用逗号分隔合并到新列df3_user。

数据示例

df1

df1_ID  df1_Tag df1_Info    df1_user
   1    Test1   Pass        100,200,300
   2    Test2   Pass        400,500,600,700
   3    Test3   Fail        800,900,1000,1100,1200
   4    Test4   Pass        1300
   5    Test5   Pass        1400,1500

df2

df2_user
100
300
500
600
700
1100
1200
1300
1400
1600

期望结果df3

df1_ID  df1_Tag df1_Info    df3_user
1        Test1  Pass         100,300
2        Test2  Pass         500,600,700
3        Test3  Fail         1100,1200
4        Test4  Pass         1300
5        Test5  Pass         1400

现有代码问题

现有循环代码每次匹配到单个用户ID就直接赋值给df3_user,后续匹配会覆盖之前的结果,无法实现多值合并:

for name in df2['df2_user'].to_list():
    df1.loc[ df1['df1_user'].str.contains(name), 'df3_user' ] = name

解决方案

通过apply逐行处理,结合集合高效查找匹配项,最后合并结果:

import pandas as pd

# 假设已读取df1和df2数据
# df1 = pd.read_csv(...)
# df2 = pd.read_csv(...)

# 将df2的用户ID转为字符串集合,加速匹配
target_users = set(df2['df2_user'].astype(str))

# 定义每行的处理逻辑
def get_matched_users(row):
    # 拆分当前行的用户ID列表
    current_users = row['df1_user'].split(',')
    # 筛选出同时在目标集合中的ID
    matched = [user for user in current_users if user in target_users]
    # 合并为逗号分隔的字符串,无匹配则返回空
    return ','.join(matched)

# 生成df3_user列
df1['df3_user'] = df1.apply(get_matched_users, axis=1)

# 提取需要的列得到最终df3
df3 = df1[['df1_ID', 'df1_Tag', 'df1_Info', 'df3_user']].copy()

# 打印结果
print(df3)

方案说明

  1. 集合优化查找:将df2的用户ID转为集合,把每次查找的时间复杂度从O(n)降到O(1),处理大数据量时效率更高。
  2. 逐行收集匹配项:对每行的df1_user拆分后,收集所有匹配的ID,再用逗号合并,避免了循环赋值的覆盖问题。
  3. 类型统一:将df2的数字类型ID转为字符串,确保和df1中字符串格式的ID匹配一致。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 04:30:58