2015-11-23 172 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