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

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))

关键修正点解释

  1. CSV读取逻辑修复:

    • sep='|':明确告诉pandas用竖线作为字段分隔符(你之前的代码默认用逗号分割,导致所有字段被混在一列)
    • quotechar='"', skipinitialspace=True:处理CSV中带引号的字段,同时忽略字段值前后的空格(比如"41614335"|Reinaldo里Reinaldo前面的空格)
    • dtype={"source_id": str}:可选配置,避免像07605348这类带前导零的source_id被自动转成整数丢失前导零
  2. 分组聚合逻辑简化:

    • 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 07:27:44