将供应商名称提取到数据框中的单独列中

时间:2019-05-06 16:41:34

标签: python regex pandas

我有一个数据框(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+)')

任何帮助,我们将不胜感激。谢谢!

2 个答案:

答案 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} 
 )