【问题标题】:Read data and convert to json format with some specific format读取数据并转换为具有某些特定格式的 json 格式
【发布时间】:2021-10-29 07:28:18
【问题描述】:

我正在读取 csv 文件并将其转换为 json 文件,但我需要从数据中创建“地址”字段作为数组字段。我已经为它编写了代码,但无法将其作为数组。 所有与地址相关的字段都在地址列下,地址列是一个数组字段。

输入文件

"source_id"|"first_name"|"last_name"|"address_type"|"address_line_1"|"city"
"41614335"|Reinaldo|Tonkoski Jr.|Primary|Deh 211 Box 2222|Brookings|
"41614335"|Reinaldo|Tonkoski Jr.|home|"2409 10th St Apt 123"|Brookings
"07605348"|E|Christodoulou|Primary|"4D Ag Lavras st"|Kifissia
"07605348"|E|Christodoulou|home|"131 N Hamilton Dr Apt 308"|Beverly Hills

输出获取

[
   {
      "source_id":7605348,
      "first_name":"E",
      "last_name":"Christodoulou",
      "parsed_address":[
         {
            "address_type":"Primary",
            "address_line_1":"4D Ag Lavras st",
            "city":"Kifissia"
         }
      ]
   },
   {
      "source_id":7605348,
      "first_name":"E",
      "last_name":"Christodoulou",
      "parsed_address":[
         {
            "address_type":"home",
            "address_line_1":"131 N Hamilton Dr Apt 308",
            "city":"Beverly Hills"
         }
      ]
   }
]

预期输出:

[
   {
      "source_id":7605348,
      "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":"Kifissia"
         },
         {
            "address_type":"home",
            "address_line_1":"2409 10th St Apt 123",
            "city":"Beverly Hills"
         }
      ]
   }
]

代码尝试

df = pd.read_csv("file")
g_cols = ['source_id', 'first_name', 'last_name']
cols = ['address_type', 'address_line_1', 'city']
# Handling Address fields
df2 = df.drop_duplicates().groupby(g_cols)[cols].apply(lambda x: x.to_dict('records')).reset_index(
        name="parsed_address").to_dict('record')

    # Removing duplicate entry in address field
    for i in range(0, len(df2)):
        final_list = [dict(s) for s in set(frozenset(d.items()) for d in df2[i]["parsed_address"])]
        df2[i]["parsed_address"] = final_list

    # Convert resultant list to pandas dataframe
    df22 = pd.DataFrame(df2)
    print(df22)

【问题讨论】:

  • 嘿,您是否为此发布了部分代码?运行此代码时,我似乎遇到了 source_id 的关键错误。
  • 发布了部分代码,因为实现的代码也形成了其他一些要求,但是这段代码很好地定义了问题。你能告诉我你从这段代码中得到了什么确切的错误吗?
  • 是的,它说 KeyError: 'source_id' at line 7 df2 = df.drop()...
  • 请在此处输入行。请检查输入数据和代码中的拼写
  • 不知道为什么会抛出这个错误。您能否检查我的代码并让我知道我在代码中缺少什么以在 json 输出中正确获取地址字段

标签: python arrays json


【解决方案1】:
dic_address =[]
for source, group in df.groupby(by=["source_id"]):

    address_dic = {}
    address_dic["source_id"] = source
    address_dic["address"] = group.drop(columns=["source_id", "first_name", "last_name").to_dict("record")
    dic_address.append(address_dic)
    print(dic_address)

    df_add = pd.DataFrame(dic_address)

    listval = ['first_name', 'last_name']
    
    df_source_group = df.drop_duplicates().groupby("source_id")[listval].agg(
        lambda x: ','.join(set(x))).reset_index().to_dict('record')
    
    df22 = pd.DataFrame(df_source_group)
    df_merge = pd.merge(df_add,df22)

    
    
    
    

【讨论】:

    猜你喜欢
    • 2020-12-09
    • 2020-08-05
    • 1970-01-01
    • 2016-11-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-29
    相关资源
    最近更新 更多