2016-09-08 4 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 

私はforループを作成しようとしましたが、私にアプローチする方法を見つけ出すことはできませんループ。

重要な注意:私は月が09/10/11/12であれば2月2016

を通じてすべての観測のための期間は2015年9月の間にあることを知っている - そして、私は「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'は文字列であるようです。だからあなたが試しているすべてのメソッド(catを含む)は動作する可能性は非常に低いです。 –

+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

@ケビン、あなたは絶対に正しいです!私は私の答えを修正しました... – MaxU

関連する問題