将逗号后的最后一个术语提取到新列中

时间:2018-04-04 20:51:12

标签: python string pandas split

我有一个pandas数据帧,基本上是2列和9000行

CompanyName  |  CompanyAddress

,地址格式为

Line1, Line2, ..LineN, PostCode

即。字符串中基本上不同数量的以逗号分隔的项目(或dtype' object'),我想简单地提取邮政编码,即字段中最后一个逗号后的项目

我已经尝试了Dot notation string manipulation建议(可能很糟糕):

df_address['CompanyAddress'] = df_address['CompanyAddress'].str.rsplit(', ') 

只是放了' []'在字段周围 - 我没有成功地尝试隔离任何拆分/分区字符串的最后一个组件,maxsplit引发错误。

在EdChums对Pandas split Column into multiple columns by comma

发表评论后,我取得了一定程度的成功
pd.concat([df_address[['CompanyName']], df_address['CompanyAddress'].str.rsplit(', ', expand=True)], axis=1)

然而,在隔离邮政编码的同时,这只会创建多个列,邮政编码在第3-6列中......同样没有用。

感觉非常接近,请指教。

    EmployerName    Address
0   FAUCET INN LIMITED  [Union, 88-90 George Street, London, W1U 8PA]
1   CITIBANK N.A    [Citigroup Centre,, Canary Wharf, Canada Squar...
2   AGENCY 2000 LIMITED     [Sovereign House, 15 Towcester Road, Old Strat...
3   Transform Trust     [Unit 11 Castlebridge Office Village, Kirtley ...
4   R & R.C.BOND (WHOLESALE) LIMITED    [One General Street, Pocklington Industrial Es...
5   MARKS & SPENCER FINANCIAL SERVICES PLC  [Marks & Spencer Financial, Services Kings Mea...

3 个答案:

答案 0 :(得分:2)

鉴于DataFrame,

df = pd.DataFrame({'Name': ['ABC'], 'Address': ['Line1, Line2, LineN, PostCode']})

    Address                         Name
0   Line1, Line2, LineN, PostCode   ABC

如果您只需要发布代码,可以使用rsplit将其解压缩并重新分配给列地址。它会为你节省concat的步骤。

df['Address'] = df['Address'].str.rsplit(',').str[-1] 

你得到了

    Address     Name
0   PostCode    ABC

编辑:在列表

中提供包含地址值的数据框
df = pd.DataFrame({'Name': ['FAUCET INN LIMITED'], 'Address': [['Union, 88-90 George Street, London, W1U 8PA']]})

    Address                                         Name
0   [Union, 88-90 George Street, London, W1U 8PA]   FAUCET INN LIMITED

您可以使用

获取最后一个元素
df['Address'] = df['Address'].apply(lambda x: x[0].split(',')[-1])

你得到了

    Address     Name
0   W1U 8PA     FAUCET INN LIMITED

答案 1 :(得分:0)

只需 rsplit 将现有列分为2列 - 现有列和新列。如果您想保持现有列的完整性,可以使用两个新的。

df['Address'], df['PostCode'] = df['Address'].str.rsplit(', ', 1).str

编辑:由于OP的地址列是一个包含1个字符串的列表,因此这里有一个特别的解决方案:

df['Address'], df['PostCode'] = df['Address'].map(lambda x: x[0]).str.rsplit(', ', 1).str

答案 2 :(得分:0)

rsplit返回一个列表,尝试使用rsplit(',')[0]来获取源代码行中的最后一个元素