2015-11-23 104 views
0

我有一个非索引数据帧(从csv文件读取)如下:大熊猫验证数据帧细胞

John Mullen 12/08/1993 Passw0rd 
Lisa Bush 06/12/1990 myPass12 
Maria Murphy 30/03/1989 qwErTyUi 
Seth Black 21/06/1991 LoveXmas 

我想验证每个行的每个单元针对特定正则表达式

  • 验证出生日期为dd/mm/yyyy
  • 验证与PassRegex密码下面
  • 验证姓/与NameRegex
  • 下面
  • 名称替换为“头名_
  • 等...

然后将其中的任何细胞不验证的行新的数据框。

import re 
PassRegex = re.compile(r"^(?!.*\s)(?=.*[A-Z])(?=.*[a-z])(?=.*\d).{8,50}$") 
NameRegex = re.compile(r"^[a-zA-Z0-9\s\-]{2,80}$") 

有没有办法做到这一点,而不是逐行遍历整个数据框,并逐个单元格?

任何帮助,非常感谢。

+0

请扩展您的问题,具体用例示例以及您当前的问题处理方法。即使伪代码很好,你不必使其可执行。这将有助于更好地理解你的问题。 – Kartik

+1

对于日期,您可以执行'pd.to_datetime(df ['date'],coerce = True)''这样我就会生成'NaT',其中数据格式不正确,您可以使用这些位置来屏蔽df并将它们放置在一个单独的DF – EdChum

回答

0

有没有办法做到这一点,而不是遍历整个数据 帧逐行,逐个单元?

您不必查看每一行中的每个值,但显然,在每一行中,都必须查看与过滤器/条件相关的列。

from pandas import DataFrame 
from dateutil.parser import parse 

df = DataFrame([['John', 'Mullen', '12/08/1993', 'Passw0rd'], 
... ['Lisa', 'Bush' , '06/12/1990', 'myPass12'], 
... ['Maria' , 'Murphy', '30/03/1989', 'qwErTyUi'], 
... ['Seth' , 'Black' , '21/06/1991' , 'LoveXmas']]) 

df.columns = ['name1','name2','date','pwd'] 

# convert date column to datetime type 
df.date = df.date.apply(parse) 

>>> df[df.date > parse('1/1/91')] 
    name1 name2  date  pwd 
0 John Mullen 1993-12-08 Passw0rd 
3 Seth Black 1991-06-21 LoveXmas 

>>> df[df.date <= parse('1/1/91')] 
    name1 name2  date  pwd 
1 Lisa Bush 1990-06-12 myPass12 
2 Maria Murphy 1989-03-30 qwErTyUi 

>> indexes = df[df.date <= parse('1/1/91')].index 
>> new_df = DataFrame(df.drop(indexes)) 
>>> new_df 
    name1 name2  date  pwd 
0 John Mullen 1993-12-08 Passw0rd 
3 Seth Black 1991-06-21 LoveXmas