Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/278.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 获取字典/列表,并映射到具有x个匹配列的数据帧_Python_Pandas_Parsing - Fatal编程技术网

Python 获取字典/列表,并映射到具有x个匹配列的数据帧

Python 获取字典/列表,并映射到具有x个匹配列的数据帧,python,pandas,parsing,Python,Pandas,Parsing,我有一个包含两列的表。 我一直在探索使用地址解析,理想情况下,我希望解析地址,并将结果放入新的列中 import usaddress addr='123 Main St. Suite 100 Chicago, IL' 返回解析结果有两个选项,我计划使用更容易添加到数据帧的选项: usaddress.parse(addr)parse方法会将地址字符串拆分为多个组件,然后 标记每个组件。(退货清单) usaddress.tag(addr)tag方法将尝试变得更智能一点,它将合并连续的组件、带逗号

我有一个包含两列的表。

我一直在探索使用地址解析,理想情况下,我希望解析地址,并将结果放入新的列中

import usaddress
addr='123 Main St. Suite 100 Chicago, IL'
返回解析结果有两个选项,我计划使用更容易添加到数据帧的选项:

  • usaddress.parse(addr)
    parse方法会将地址字符串拆分为多个组件,然后 标记每个组件。(退货清单)
  • usaddress.tag(addr)
    tag方法将尝试变得更智能一点,它将合并连续的组件、带逗号并返回地址类型(返回有序列表)
  • 使用此解析器的地址有26个不同的标记

    但是,并非所有地址都包含所有这些标记

    我需要获取每一行的完整地址,解析它,将解析结果映射到同一行中的每个匹配列


    我不太明白如何处理逐行计算和映射结果的逻辑

    首先,从解析服务创建一列json响应

    df['json_response'] = df['address'].apply(usaddress.pars)
    
    接下来,将所有json组合成一个json字符串

    json_combined = json.dumps(list(df['json_response']))
    
    df_parsed = pd.io.json.json_normalize(json.loads(json_combined))
    
    最后将组合的json解析为数据帧(解析json字符串后)

    现在,您应该有一个包含所有必需列的结构化数据框架,您可以
    df。将
    与原始数据框架连接起来,以生成一个统一的数据集


    请注意,根据返回的json的结构,您可能需要向`函数传递更多参数。链接页面上的示例是一个很好的起点。

    发布此解决方案的时间非常晚,但希望在其他人遇到相同问题时发布

    地址csv文件标题:

    name, address
    
    进口:

    import pandas as pd
    import numpy as np
    import json
    import itertools
    import usaddress
    
    def address_func(address):
        try:
            return usaddress.tag(address)
        except:
            return [{'AddressConverstion':'Error'}]
    
    # import file
    file = pd.read_excel('addresses.xlsx')
    
    # apply function
    file['tag_response'] = file['Full Address'].apply(address_func)
    
    # copy values to new column
    file['tags'] = file.apply(lambda row: row['tag_response'][0], axis=1)
    
    # dump json
    tags_combined = json.dumps(list(file['tags']))
    
    # create dataframe of parsed info
    df_parsed = pd.io.json.json_normalize(json.loads(tags_combined))
    
    # merge dataframes on index
    merged = file.join(df_parsed)
    

    谢谢你的回复!方向绝对正确。我在最后一行遇到了一个问题
    list object jas no attribute values
    如果不查看实际输出,很难准确地知道发生了什么,但是函数
    usaddress.pars
    似乎不是返回JSON,而是返回一个列表。您需要将列表对转换为具有类似于JSON的键值对结构的dict。查看此链接。
    import pandas as pd
    import numpy as np
    import json
    import itertools
    import usaddress
    
    def address_func(address):
        try:
            return usaddress.tag(address)
        except:
            return [{'AddressConverstion':'Error'}]
    
    # import file
    file = pd.read_excel('addresses.xlsx')
    
    # apply function
    file['tag_response'] = file['Full Address'].apply(address_func)
    
    # copy values to new column
    file['tags'] = file.apply(lambda row: row['tag_response'][0], axis=1)
    
    # dump json
    tags_combined = json.dumps(list(file['tags']))
    
    # create dataframe of parsed info
    df_parsed = pd.io.json.json_normalize(json.loads(tags_combined))
    
    # merge dataframes on index
    merged = file.join(df_parsed)