我对Python很陌生并努力执行我需要的东西
我需要从字符串中提取Zip代码" concat"。
我正在研究正则表达式,但我在功能方面苦苦挣扎。
import pandas as pd
import re
from pandas import ExcelWriter
我导入了CSV,编码文本类型的字符串上传问题,已建立的数据框列,并使其自己的df
Client = pd.read_csv("CLZIPrevamp3.csv",encoding = "ISO-8859-1")
Client = Client[["clnum","concat"]]
clientzip = Client['concat']
CSV示例
client number client add
40008 All, EdNULLNULLNULLNULLNULL
40009 EC, Inc. 4200 Exec-ParkwayS, MO 63141Attn: John Smith
40010 AWBWA, Inc. 2200 Northhighschool,VA 21801-7824Attn: TerryLongNULL NULL
示例目的
邮政编码也将匹配国际邮政编码,4位和5位邮政编码,所有字段都没有邮政编码
然后,我想将结果重写回我的客户端数据框,作为匹配答案的第三列
答案 0 :(得分:1)
ZIP始终是美国邮政编码吗?字段末尾有5位数字?
然后切掉它。
>>> 'smithjonllcRichmondVa23220'[-5:]
'23220'
如果您有4位数字,那么您可能需要正则表达式
>>> import re
>>> re.findall('\d{4,5}$', 'smithjonllcRichmondVa3220')[0]
'3220'
对于像21801-7824
这样的“长邮政编码”,它变得更加复杂,当列本身包含逗号时,您会被传递给CSV文件(参见示例)
AWBWA, Inc. 2200 Northhighschool,VA
你只需要求一种不同的数据格式,因为好运解析它。
就pandas而言,您可以apply()
对列进行操作。
答案 1 :(得分:0)
我将提供2个例子。
老实说,如果你的CSV一直按照你在例子中提到的格式进行格式化,你可以使用像这样的简单有限正则表达式找到zipcodes(它捕获字符串之前的所有非空格字符" Attn& #34;这似乎是你读取字符串中的主题):
>>> def zipcodes():
import re
csv = '''client number client add
40008 All, EdNULLNULLNULLNULLNULL
40009 EC, Inc. 4200 Exec-ParkwayS, MO 63141Attn: John Smith
40010 AWBWA, Inc. 2200 Northhighschool,VA 21801-7824Attn: TerryLongNULL NULL'''
zips = re.findall('([\S]+)Attn', csv)
print(zips)
<强>输出:强>
>>> zipcodes()
['63141', '21801-7824']
...
...
现在,如果你想要更好的东西,通过忽略开始新行的数字来区分你可以使用这样的先行示例(注意:Python的前瞻文档不是最好的...... sheesh)。下面的预测是&#39;捕获5到6范围内的一串数字,如果适用的话,它们之间有0或1个数字,可能后跟任意数量的数字(在这种情况下为0或大于0)但只有在没有换行字符的情况下才会捕获这些数字&#39;
>>> def zipcodes():
import re
csv = '''client number client add
40008 All, EdNULLNULLNULLNULLNULL
40009 EC, Inc. 4200 Exec-ParkwayS, MO 63141Attn: John Smith
40010 AWBWA, Inc. 2200 Northhighschool,VA 21801-7824Attn: TerryLongNULL NULL'''
zips = re.findall('(?<!\n)[\d]{5,6}[\-]?[\d]*', csv)
print(zips)
<强>输出:强>
>>> zipcodes()
['63141', '21801-7824']
希望这有帮助。