如何从列表中删除所有符合特定条件的元素?

时间:2018-07-24 16:44:56

标签: python regex python-3.x pandas dataframe

我试图解析包含在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)

非常感谢!

1 个答案:

答案 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)
相关问题