熊猫,将元组列表列表转换为DataFrame尴尬的列标题。

时间:2018-09-10 19:11:11

标签: python pandas

我有从usaddress python库https://github.com/datamade/usaddress中获得的解析地址中的数据

数据是元组列表的列表。每个地址都有一个与此相关的列表:

[('Robie', 'BuildingName'),
('House,', 'BuildingName'),
('5757', 'AddressNumber'),
('South', 'StreetNamePreDirectional'),
('Woodlawn', 'StreetName'),
('Avenue,', 'StreetNamePostType'),
('Chicago,', 'PlaceName'),
('IL', 'StateName'),
('60637', 'ZipCode')]

但是,对于某些地址,某些字段可能存在也可能不存在。我想将此数据导出到具有所有列标题(BuildingName,Address ... ect)的pandas DataFrame中,如果列表中不存在该列标题,则该单元格将保留为空白。

我目前所拥有的是:

newAddr = []
for index, row in df.iterrows():
    newAddr.append(usaddr.parse(row['FullAddress']))

df2 = DataFrame(newAddr)

但是这会产生一个没有列标题并且没有按列进行实际组织的文件,因为缺少的值只会将所有内容移过来。

非常感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

假设以下内容:

  • 您使用usaddress.tag
  • 有一些方法可以处理usaddress.tag可能引起的错误
  • 只希望从usaddress.tag返回的第一部分

然后,您可以执行以下操作

import usaddress
import pandas as pd

# your list of addresses dataframe
df = pd.read_csv('PATH_TO_ADDRESS_CSV')

# list of orderedDict
ordered_dicts = []

# loop through addresses and get respective information
for index, row in df.iterrows():
    # here you should try/except for cases that fail
    addr = usaddress.tag(row['FullAddress'])

    # append to list
    ordered_dicts.append(addr[0])

# **get all relevant keys in your list
cols = set().union(*(d.keys() for d in ordered_dicts))

# create new dataframe
df_new = pd.DataFrame(ordered_dicts, columns=cols)

df_new.to_csv('PATH_TO_DESIRED_CSV_ENDPOINT')

**代表此功能部分的替代解决方案。因为我们完全知道.tag函数可以返回的所有列,所以您可以一开始就这样设置这些列(请参见所有标签here和API here):

cols = ['AddressNumberPrefix', 'AddressNumber', ...]

我希望这会有所帮助!知道当您对字典进行pd.DataFrame并指定确切的列时,它将自动用pd.NaN填充不存在的键。