2016-09-08 6 views
2

현재 일부 문제점이있는 날짜 열이 있습니다. 문제를 해결하려고 시도했지만 결론에 도달 할 수 없습니다. 예상대로팬더 데이터 프레임에서 Regex 루프 실행

# Import data 
df_views = pd.read_excel('PageViews.xlsx') 

# Check data types 
df_views.dtypes 
Out[57]: 
Date   object 
Customer ID  int64 
dtype: object 

날짜 열은 '날짜'데이터 형식이 아닙니다 : 여기

데이터이다. 또한 검사 수율 :

df_views.ix[:5] 
Date Customer ID 
0 01/25/2016 104064596300 
1 02/28/2015 102077474472 
2 11/17/2016 106430081724 
3 02/24/2016 107770391692 
4 10/05/2016 106523680888 
5 02/24/2016 107057691592 
내가 빨리 적절한 형식을 따르지 않는 행을 확인

XX/XX/XXXX 나는 루프를 작성하려고했지만 접근하는 방법을 알아낼 수 없습니다

print (df_views[df_views["Date"].str.len() != 10]) 
      Date Customer ID 
189513 12/14/ 106285770688 
189514 10/28/ 107520462840 
189515 11/01/ 102969804360 
189516 11/10/ 102106417100 
189517 02/16/ 107810168068 
189518 10/25/ 102096164504 
189519 02/08/ 107391760644 
189520 02/29/ 107353558928 
189521 10/24/ 107209142140 
189522 12/20/ 107875461336 
189523 12/23/ 107736375428 
189524 11/12/ 106561080372 
189525 01/27/ 102676548120 
189526 11/19/ 107733043896 
189527 12/31/ 107774452412 
189528 01/21/ 102610956040 
189529 01/09/ 108052836888 
189530 02/21/ 106380330112 
189531 02/02/ 107844459772 
189532 12/12/ 102006641640 
189533 12/16/ 106604647688 
189534 11/14/ 102383102504 

내 고리.

중요 사항 : 나는 모든 관측 기간이 한 달이 09/10/11/12 경우 2016

그래서 월에서 2 년 9 월 2015 사이 것을 알고 - 나는이에 "2015"를 추가 할 수 있습니다 날짜가 인 경우 그렇지 않으면 월이 01/02 인 경우 '2016'을 추가 할 수 있습니다.

for row in df_views["Date"]: 
    if len(row) != 10: 
     if row.str.contains("^09|10|11|12\/"): 
      row.str.cat("2015") 
     elif row.str.contains("^01|02\/"): 
      row.str.cat("2016") 
    else: 
     continue 
--------------------------------------------------------------------------- 
AttributeError       Traceback (most recent call last) 
<ipython-input-87-684e121dd62d> in <module>() 
     5 for row in df_views["Date"]: 
     6  if len(row) != 10: 
----> 7   if row.str.contains("^09|10|11|12\/"): 
     8    row.str.cat("2015") 
     9   elif row.str.contains("^01|02\/"): 

AttributeError: 'str' object has no attribute 'str' 
+1

'row'는 문자열로 보입니다. 그래서 노력하고있는 모든 방법 (포함, 고양이)은 거의 작동하지 않을 것입니다. –

+3

for 루프를 사용하지 마십시오. Series에서 직접 사용하고있는'.str' 연산을 사용하십시오. 조정할 필요가있을 수 있지만 명시 적 반복보다 빠릅니다. – BrenBarn

답변

1

@BrenBam has already written in the comment - 루프를 사용하지 않도록하십시오. 팬더는 우리에게 수 많은 벡터화 된 (빠르고 효율적인 읽기) 방법을 제공합니다.

In [67]: df 
Out[67]: 
      Date Customer ID 
0 12/14/2001 106285770688 
1 10/28/2000 107520462840 
2  11/01/ 102969804360 
3  11/10/ 102106417100 
4  02/16/ 107810168068 
5  10/25/ 102096164504 
6  02/08/ 107391760644 
7  02/29/ 107353558928 
8  10/24/ 107209142140 
9  12/20/ 107875461336 
10  12/23/ 107736375428 
11  11/12/ 106561080372 
12  01/27/ 102676548120 
13  11/19/ 107733043896 
14  12/31/ 107774452412 
15  01/21/ 102610956040 
16  01/09/ 108052836888 
17  02/21/ 106380330112 
18  02/02/ 107844459772 
19  12/12/ 102006641640 
20  12/16/ 106604647688 
21  11/14/ 102383102504 

In [68]: df.ix[df.Date.str.match(r'^(?:09|10|11|12)\/\d{2}\/$', as_indexer=True), 'Date'] += '2015' 

In [69]: df.ix[df.Date.str.match(r'^(?:01|02)\/\d{2}\/$', as_indexer=True), 'Date'] += '2016' 

In [70]: df 
Out[70]: 
      Date Customer ID 
0 12/14/2001 106285770688 
1 10/28/2000 107520462840 
2 11/01/2015 102969804360 
3 11/10/2015 102106417100 
4 02/16/2016 107810168068 
5 10/25/2015 102096164504 
6 02/08/2016 107391760644 
7 02/29/2016 107353558928 
8 10/24/2015 107209142140 
9 12/20/2015 107875461336 
10 12/23/2015 107736375428 
11 11/12/2015 106561080372 
12 01/27/2016 102676548120 
13 11/19/2015 107733043896 
14 12/31/2015 107774452412 
15 01/21/2016 102610956040 
16 01/09/2016 108052836888 
17 02/21/2016 106380330112 
18 02/02/2016 107844459772 
19 12/12/2015 102006641640 
20 12/16/2015 106604647688 
21 11/14/2015 102383102504 
+0

솔루션이 작동하지만 문제가없는 시나리오에서 나머지 데이터 프레임에 '2015'또는 '2016'이 추가됩니다. 이 정규 표현식이 내 마지막에 작동했습니다 : ''^ (09 | 10 | 11 | 12) \/\ d \ d \/\ '' – Kevin

+0

@Kevin, 당신은 절대적으로 옳습니다! 내 대답을 바로 잡았어. – MaxU

관련 문제