CSV转JSON时合并同用户多地址为数组字段的技术求助
问题分析与解决方案
我帮你排查了代码里的问题,核心原因是CSV读取阶段没有指定正确的分隔符,导致后续的分组逻辑完全失效,才会出现每个地址对应一条用户记录的情况。除此之外,你后面添加的去重循环其实是多余的(如果原数据没有重复地址行的话),反而可能打乱地址的原有顺序。
修正后的完整代码
import pandas as pd import json # 正确读取竖线分隔的CSV,处理引号和字段间的空格 df = pd.read_csv( "your_file.csv", sep='|', quotechar='"', skipinitialspace=True, dtype={"source_id": str} # 可选:保持source_id为字符串,避免前导零丢失 ) # 定义分组键(用户唯一标识)和需要聚合的地址字段 group_cols = ['source_id', 'first_name', 'last_name'] address_cols = ['address_type', 'address_line_1', 'city'] # 分组聚合,将同一用户的所有地址合并为数组 result_df = df.groupby(group_cols)[address_cols].apply( lambda x: x.to_dict('records') ).reset_index(name='parsed_address') # 转换为符合要求的JSON格式列表 result_json = result_df.to_dict('records') # 格式化打印结果 print(json.dumps(result_json, indent=2))
关键修正点解释
CSV读取逻辑修复:
sep='|':明确告诉pandas用竖线作为字段分隔符(你之前的代码默认用逗号分割,导致所有字段被混在一列)quotechar='"', skipinitialspace=True:处理CSV中带引号的字段,同时忽略字段值前后的空格(比如"41614335"|Reinaldo里Reinaldo前面的空格)dtype={"source_id": str}:可选配置,避免像07605348这类带前导零的source_id被自动转成整数丢失前导零
分组聚合逻辑简化:
groupby(group_cols):按source_id、first_name、last_name的组合作为唯一用户标识分组apply(lambda x: x.to_dict('records')):将每个分组内的地址字段直接转换为字典列表,也就是你需要的parsed_address数组- 去掉了多余的去重循环,因为分组后已经天然聚合了同一用户的所有地址
测试输出
运行上述代码后,你会得到和期望完全一致的结果:
[ { "source_id": "07605348", "first_name": "E", "last_name": "Christodoulou", "parsed_address": [ { "address_type": "Primary", "address_line_1": "4D Ag Lavras st", "city": "Kifissia" }, { "address_type": "home", "address_line_1": "131 N Hamilton Dr Apt 308", "city": "Beverly Hills" } ] }, { "source_id": "41614335", "first_name": "Reinaldo", "last_name": "Tonkoski Jr.", "parsed_address": [ { "address_type": "Primary", "address_line_1": "Deh 211 Box 2222", "city": "Brookings" }, { "address_type": "home", "address_line_1": "2409 10th St Apt 123", "city": "Brookings" } ] } ]
额外提示
如果你的原始CSV中有重复的地址行(同一用户的同一地址出现多次),可以在分组前添加一行代码去除重复项:
df = df.drop_duplicates(subset=group_cols + address_cols)
内容的提问来源于stack exchange,提问作者Naveen
相关产品推荐
相关产品推荐

