我试图解析包含在pandas Dataframe列中的字符串列表,并提取某些生日(dd.dd.dddd或dd / dd / dddd格式)。我的目的是将其存储在名为date的新列表中,并保持与以前的数据框相同的索引。这是我的第一个示例代码:
date=[]
for i in range(df['Text']):
a=re.findall(r'[\d]{1,2}[/\.][\d]{1,2}[/\.][\d]{4}', df['Text'][i])
date.append(a)
但是,如果我仅编写此代码(它解析良好的值,但没有足够的限制),我将获得出生日期,但也可以获得其他不太重要的日期:
[[], [], [], [], [], [], [], ['17/02/1997'], ['26.07.1990', '17.03.2014',
'01.11.2017', '01.07.2013', '06.09.2013', '01.10.2011', '01.06.2013',
'25.09.2013', '15.03.2014', '15.09.2011', '15.08.2014', '11.09.2009',
'02.07.2011', '15.09.2008', '30.07.2009', '15.09.2007', '30.07.2008'], [],
[], [], []]
因此,我实际上知道2003年之后的每个日期都不是出生日期。 所以我想要一个只会返回的脚本:
[[], [], [], [], [], [], [], ['17/02/1997'], ['26.07.1990'], [],
[], [], []]
然后,我编写此脚本,但似乎我的循环缺少某个日期来检查其是否符合条件(请参见印刷品以检查循环所关注的内容):
date=[]
for i in range(df['Text']):
a=re.findall(r'[\d]{1,2}[/\.][\d]{1,2}[/\.][\d]{4}', df['Text'][i])
for k in a:
print(k +"prems")
if k[-4:].isdigit()==True and int(k[-4:])>2003:
print(k)
a.remove(k)
date.append(a)
[Out]:
17/02/1997prems
26.07.1990prems
17.03.2014prems
17.03.2014
01.07.2013prems
01.07.2013
01.10.2011prems
01.10.2011
25.09.2013prems
25.09.2013
15.09.2011prems
15.09.2011
11.09.2009prems
11.09.2009
15.09.2008prems
15.09.2008
15.09.2007prems
15.09.2007
[[], [], [], [], [], [], [], ['17/02/1997'], ['26.07.1990', '01.11.2017',
'06.09.2013', '01.06.2013', '15.03.2014', '15.08.2014', '02.07.2011',
'30.07.2009', '30.07.2008'], [], [], [], []]
有没有人理解,考虑到他们回答了循环的标准,为什么不根据此标准从列表中删除2003年以后的日期?
如果在regex表达式中有一种更简单的方法(我是该领域的初学者),那可能也是最好的方法。
编辑 感谢@Sunitha的评论,我得到了所需的输出:
date=[]
for i in range(df['Text']):
a=re.findall(r'[\d]{1,2}[/\.][\d]{1,2}[/\.][\d]{4}', df['Text'][i])
date.append(a)
#Capture the non birthdate
not_date=[]
for i in range(df['Text']):
a=re.findall(r'[\d]{1,2}[/\.][\d]{1,2}[/\.][\d]{4}', df['Text'][i])
for k in a:
print(k +"prems")
if k[-4:].isdigit()==True and int(k[-4:])>2003:
print(k)
not_date.append(k)
#Remove the non birthdate from the list of list
for k in not_date:
print(k)
for i in range(len(date)):
if k in date[i]:
date[i].remove(k)
print(date)
非常感谢!
答案 0 :(得分:3)
本·琼斯(Ben Jones)在评论Removing elements from a list while iterating over that list always causes problems
中指出。因此,与其从列表a
中删除元素,不如将结果直接附加到列表date
date=[]
for i in range(df['Text']):
a=re.findall(r'[\d]{1,2}[/\.][\d]{1,2}[/\.][\d]{4}', df['Text'][i])
for k in a:
print(k +"prems")
if k[-4:].isdigit()==True and int(k[-4:])>2003:
print(k)
date.append(k)