用不均匀长度的列表项创建pandas df列?

2024-05-17 03:18:52 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个地址列表,我想把它放入一个数据帧中,每一行都是一个新地址,列是地址的单位(标题、街道、城市)。在

但是,从列表的结构来看,有些地址比其他地址长。例如:

address = ['123 Some Street, City','45 Another Place, PO Box 123, City']

我有一个pandas数据帧,包含以下列:

^{pr2}$

我想根据地址中逗号分隔符的数量,将Address列拆分为至多三个列,并在缺少值的地方填充NaN。在

例如,我希望数据如下所示:

Index     Court       Address          Address2     City           Zip  Phone                                          
0         Court 1     123 Court Dr     NaN          Springfield    ...   ...           
1         Court 2     45 Court Pl      PO Box 45    Pawnee         ...   ...
2         Court 3     1725 Slough Ave  NaN          Scranton       ...   ...
3         Court 4     101 Court Ter    Unit 321     Eagleton       ...   ...

我在StackOverflow上尝试了大量不同的解决方案,但都没有成功。我得到的最接近的是这个代码:

df2 = pd.concat([df, df['Address'].str.split(', ', expand=True)], axis=1)

但这将返回一个dataframe,该数据框将以下三个列添加到结构如下的末尾:

...  0              1             2
... 123 Court Dr   Springfield   None
... 45 Court Pl    PO Box 45     Pawnee

这很接近,但正如您所见,对于较短的条目,城市将与第二个地址行一起为较长的条目排队。在

理想情况下,第2列应该用一个城市填充每一行,第1列应该在“无”和第二个地址行之间交替(如果适用)。在

我希望这是有意义的——这是一个难以用语言表达的问题。谢谢!在


Tags: 数据boxcitydf列表address地址nan
3条回答

你可以这样做:

df['Address1'] = df['Address'].str.split(',').str[0]
df['Address2'] = df['Address'].str.extract(',(.*),')
df['City'] = df['Address'].str.split(',').str[-1]

地址,尤其是那些由人工输入产生的地址可能很棘手。但是,如果您的地址只适合这两种格式,则可以:

注意:如果有一个额外的格式你必须说明,这将打印罪魁祸首。在

def split_address(df):
    for index,row in df.iterrows():
        full_address = df['address']
        if full_address.count(',') == 3:
            split = full_address.split(',')
            row['address_1'] = split[0]
            row['address_2'] = split[1]
            row['city'] = split[2]
        else if full_address.count(',') == 2:
            split = full_address.split(',')
            row['address_1'] = split[0]
            row['city'] = split[1]
        else:
            print("address does not fit known formats {0}".format(full_address))

从本质上讲,有两件事应该对您有所帮助:一个是string.count()函数,它将告诉您字符串中逗号的数量;另一个是您已经找到的将输入拆分成数组的string.split()。您可以引用此数组的部分来将片段分配到正确的列。在

您可以考虑使用包usaddress创建函数。当我需要将地址分成几部分时,这对我非常有帮助:

import usaddress

df = pd.DataFrame(['123 Main St. Suite 100 Chicago, IL', '123 Main St. PO Box 100 Chicago, IL'], columns=['Address'])

然后创建用于分割数据的函数:

^{pr2}$

输出:

                               Address      Address1    Address2     City
0   123 Main St. Suite 100 Chicago, IL  123 Main St.   Suite 100  Chicago
1  123 Main St. PO Box 100 Chicago, IL  123 Main St.  PO Box 100  Chicago

相关问题 更多 >