我有一个数据框(df),其列df ['description]包含如下所示的文本字符串:
Compu serve Industries Inc. 584-965-7524 2568 3/8/2018 100,685,865.78
ABC_Computer Services Inc. 631-692-2571 3384 2/1/2019 5,625.25
ABCD & EFGH Industries, Inc. 718-995-1040 9759 5/25/2019 1,963.52
ABC Industries, Inc. 631-582-2640 7816 11/16/2000 1,695.66
ABC Corporation 800-242-6229 5584 2/27/2018 30,562.54
每行中不同字段之间的空格数不同。我要完成的工作是将每个字段提取到自己的单独列中。例如,我已经提取了电话,ID,日期和金额字段。我不知道如何对vendor_name进行同样的操作。
df['Phone']=df['combined_data'].str.extract('(\d{3}[-\.\s]\d{3}[-\.\s]\d{4})')
df['ID']=df['combined_data'].str.extract('(\d{4})')
df['Date']=df['combined_data'].str.extract('(\d{1,2}\/\d{1,2}\/\d{4})')
df['Amount']=df['combined_data'].str.extract('(\$?(?:\d+,)*\d+\.\d+)')
任何帮助,我们将不胜感激。谢谢!
答案 0 :(得分:1)
您可以使用
pat = r'^(.*?)\s+(\d{3}[-.\s]\d{3}[-.\s]\d{4})\s+(\d{4})\s+(\d{1,2}/\d{1,2}/\d{4})\s+(\d[\d,.]*)'
df[['VendorName','Phone','ID','Date','Amount']] = df['Description'].str.extract(pat)
请参见regex demo。
详细信息
^
-字符串的开头(.*?)
-供应商名称组:任意0个以上的字符,数量尽可能少\s+
-超过1个空格(\d{3}[-.\s]\d{3}[-.\s]\d{4})
-电话号码组:\s+
-超过1个空格(\d{4})
-ID组:四位数\s+
-超过1个空格(\d{1,2}/\d{1,2}/\d{4})
-日期组:4位数字,加1+ \s+
-超过1个空格(\d[\d,.]*)
-金额组:一个数字,然后是0+点,逗号或数字。答案 1 :(得分:0)
您可以基于唯一的电话号码正则表达式来获得公司
(?m)^[ ]*(.+?)(?=[ ]*\d{3}[-\.\s]\d{3}[-\.\s]\d{4})
https://regex101.com/r/XzXzh6/1
可读版本
(?m)
^ [ ]*
( .+? ) # (1)
(?=
[ ]*
\d{3} [-\.\s] \d{3} [-\.\s] \d{4}
)