我有一个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...
答案 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]来获取源代码行中的最后一个元素