Python 按分隔符拆分列,行中有两种不同的大小

Python 按分隔符拆分列,行中有两种不同的大小,python,regex,pandas,Python,Regex,Pandas,我试图用空格分隔符将数据帧中的一列拆分为多个列。我意识到有些行有日期字段,因此与没有日期字段的行相比,它需要额外的列。 下面是列值的示例 DA Firstname Lastname 09/30/2020 07:44 AM 9/23/2020 6:06:38 PM JW Firstname Lastname 10/25/2020 11:06 AM None 第一行不适合空格分隔符,因为有8个空格。第二行适用于我的数据集,因为将有6个空格。是否有将日期合并为分隔符的方法 [“Inital”“Fir

我试图用空格分隔符将数据帧中的一列拆分为多个列。我意识到有些行有日期字段,因此与没有日期字段的行相比,它需要额外的列。 下面是列值的示例

DA Firstname Lastname 09/30/2020 07:44 AM 9/23/2020 6:06:38 PM
JW Firstname Lastname 10/25/2020 11:06 AM None
第一行不适合空格分隔符,因为有8个空格。第二行适用于我的数据集,因为将有6个空格。是否有将日期合并为分隔符的方法

[“Inital”“Firstname”“lastname”“date/time1”“date/time2”]其中“date/time2”列也可以包括“None”

我尝试使用的代码是

dataset= pd.read_csv("newOutput6",encoding = "ISO-8859-1", delimiter="\t", names = ['Name','Date'], index=False)
tmpDF = pd.DataFrame(columns=['Initals','FName','LName','SignupTime','Waiver'])
tmpDF[['Initals','FName','LName','SignupTime','Waiver']] = dataset['Name'].str.split(' ', expand=True)
示例csv:

 ,Name,Date
0,MA FName LName 10/25/2020 09:40 PM None,"October 26, 2020,8:00AM Until 8:50AM "
1,JB FName LName 10/26/2020 07:19 AM None,"October 26, 2020,8:00AM Until 8:50AM "
2,TB FName LName 10/25/2020 09:03 PM None,"October 26, 2020,8:00AM Until 8:50AM "
3,MB FName LName 10/25/2020 09:40 PM None,"October 26, 2020,8:00AM Until 8:50AM "
4,NC FName LName 10/25/2020 10:17 PM None,"October 26, 2020,8:00AM Until 8:50AM "
5,AC FName LName 10/25/2020 09:23 PM None,"October 26, 2020,8:00AM Until 8:50AM "
6,NF FName LName 10/26/2020 07:56 AM None,"October 26, 2020,8:00AM Until 8:50AM "
7,BG FName LName 10/25/2020 10:41 PM None,"October 26, 2020,8:00AM Until 8:50AM "
8,GH FName LName 10/26/2020 07:39 AM None,"October 26, 2020,8:00AM Until 8:50AM "
9,EH FName LName 10/25/2020 10:06 PM None,"October 26, 2020,8:00AM Until 8:50AM "
10,DM FName LName 10/25/2020 11:42 PM None,"October 26, 2020,8:00AM Until 8:50AM "
11,JM FName LName 10/25/2020 09:24 PM None,"October 26, 2020,8:00AM Until 8:50AM "
12,TP FName LName 10/26/2020 12:32 AM None,"October 26, 2020,8:00AM Until 8:50AM "
13,DS FName LName 10/25/2020 11:12 PM None,"October 26, 2020,8:00AM Until 8:50AM "
14,KS FName LName 10/25/2020 07:46 PM None,"October 26, 2020,8:00AM Until 8:50AM "
15,JW FName LName 10/25/2020 11:06 AM None,"October 26, 2020,8:00AM Until 8:50AM "
16,DA FName LName 09/30/2020 07:44 AM 9/23/2020 6:06:38 PM,"October 26, 2020,9:00AM Until 9:50AM "

索引16是一个不遵循传统格式的行,我怀疑需要一个正则表达式来确定这一点。

如果FirstName和LastName中没有空格(否则如何区分它们):


更新:对于可选的首字母,您可以尝试以下模式:

pattern = ('^(?P<Initials>\w+\s)?'    # make initial optional
           + '(?P<FName>\w+)\s+'
           + '(?P<LName>\w+)\s+'
           + '(?P<SignupTime>\d+/\d+/\d+ \d+:\d+ \w+)\s'
           + '(?P<Waiver>.*)'
)
pattern=('^(?P\w+\s)?#使首字母可选
+“(?P\w+)\s+”
+“(?P\w+)\s+”
+“(?P\d+/\d+/\d+\d+:\d+\w+\s”
+“(?P.*)”
)

请注意,现在如果存在
首字母
,将有一个尾随空格,您可以轻松处理。

使用
.str.extract(r'^(\S+)\S+(\S+)\S+(\S+)(\S+)(\S+)\S+(*)
或类似的东西。在必要的地方添加更多的\s+和\s+(现在无法在手机上测试)如果Firstname或Lastname有空格怎么办?它们是以某种方式转义的吗?我没有看到任何名字中有空格,你是说像Tdel aney Last Name一样吗?好的,那么你提到的Firstname和Lastname总是字面上的“FName”和“LName”?我假设这些是人名,人名中可以有空格。如果名字中可以有空格,我们需要一种不同的方法来拆分字符串,而不仅仅是使用空格。因此,这是一种很好的表述方式,拼错了我自己的名字,“Timothy De Laney”将如何进入文件?一个选项是
0,MA Timothy De Laney 2020年10月25日晚上9:40无,“2020年10月26日上午8:00至上午8:50”
。另一个是
0,MA Timothy“De Laney”10/25/2020 09:40 PM None,“2020年10月26日,上午8:00至上午8:50”
或者
0,MA Timothy De Laney 10/25/2020 09:40 PM None,“2020年10月26日,上午8:00至上午8:50”
谢谢您的帮助,我注意到我的一些数据行没有初始值。如果没有初始值,是否有防止整行被删除的方法?
  Initials      FName     LName           SignupTime                Waiver
0       DA  Firstname  Lastname  09/30/2020 07:44 AM  9/23/2020 6:06:38 PM
1       JW  Firstname  Lastname  10/25/2020 11:06 AM                  None
pattern = ('^(?P<Initials>\w+\s)?'    # make initial optional
           + '(?P<FName>\w+)\s+'
           + '(?P<LName>\w+)\s+'
           + '(?P<SignupTime>\d+/\d+/\d+ \d+:\d+ \w+)\s'
           + '(?P<Waiver>.*)'
)