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)
方案说明
- 集合优化查找:将df2的用户ID转为集合,把每次查找的时间复杂度从O(n)降到O(1),处理大数据量时效率更高。
- 逐行收集匹配项:对每行的
df1_user拆分后,收集所有匹配的ID,再用逗号合并,避免了循环赋值的覆盖问题。 - 类型统一:将df2的数字类型ID转为字符串,确保和df1中字符串格式的ID匹配一致。
内容的提问来源于stack exchange,提问作者soosa
相关产品推荐
相关产品推荐

