2017-02-22 9 views
0

Pandasを使用して正規表現を満たす行だけを選択する方法を見つけようとしています。私の実際のデータセットdata.csvには、1つの列(見出しにはラベルが付けられていません)と数百万の行があります。最初の4行は、次のようになります。正規表現を満足する行をpandasでフィルタリングする方法

5;4Z13H;;L 
5;346;4567;;O 
5;342;4563;;P 
5;3LPH14;4567;;O 

と私は基本的に私は私のデータをフィルタリングするためにパンダを希望行4から行1から4Z13H;3LPH14;を識別する次の正規表現

([1-9][A-Z](.*?);|[A-Z][A-Z](.*?);|[A-Z][1-9](.*?);) 

を書きました選択し、行1と4 は、だから私の所望の出力は、私はその後、サブを保存したい

5;4Z13H;;L 
5;3LPH14;4567;;O 

だろうフィルタ行のセットを新しいcsvのfilteredData.csvに追加します。上記のコードは、(私はまだパンダのチャンクを使用する方法を把握しようとしている)、いくつかの構文上の問題を持っているので、私はまだのpythonに比較的新しいです

import pandas as pd 
import numpy as np 
import sys 
import re 


sys.stdout=open("filteredData.csv","w") 

def Process(filename, chunksize): 
    for chunk in pd.read_csv(filename, chunksize=chunksize): 
     df[0] = df[0].re.compile(r"([1-9][A-Z]|[A-Z][A-Z]|[A-Z][1-9])(.*?);") 
     sys.stdout.close() 


if __name__ == "__main__": 
    Process('data.csv', 10 ** 4) 

:これまでのところ、私はこれだけを持っています。しかし、主な問題は、正規表現で行をフィルタリングすることです。私は大いに

答えて

1

一つの方法は、マスクの欄に作成するために、パンダのデータフレームとしてCSVファイルを読み込んでstr.containsを使用することです誰のアドバイスをいただければと思います

df['mask'] = df[0].str.contains('(\d+[A-Z]+\d+)') #0 is the column name 
df = (df[df['mask'] == True]).drop('mask', axis = 1) 

あなたは、あなたが希望する場合は、目的のデータフレームを取得しますDF = df.reset_index()

0 
0 5;4Z13H;;L 
3 5;3LPH14;4567;;O 

秒最初のCSVファイルを読み込むだけで濾過行で編集ファイルを作成し、データフレームを作成するために、濾過CSVファイルを読み込むことであるを使用してインデックスをリセットすることができ

あなたは私の経験から

0 
0 5;4Z13H;;L 
1 5;3LPH14;4567;;O 

を得る

with open('filteredData.csv', 'r') as f_in: 
    with open('filteredData_edit.csv', 'w') as f_outfile: 
     f_out = csv.writer(f_outfile) 
     for line in f_in: 
      line = line.strip() 
      row = [] 
      if bool(re.search("(\d+[A-Z]+\d+)", line)): 
       row.append(line) 
       f_out.writerow(row) 
df = pd.read_csv('filteredData_edit.csv', header = None)  

データフレームを作成する前に望ましくない行をフィルタリングするために、より効率的であるように、私は第二の方法を好むだろう。

+0

お返事ありがとうございます。しかし、行に含まれている他のデータを保持しながら、これをどうすればできますか?したがって、 '0 4Z13'と' 3 3LPH14'の代わりに '5; 4Z13H ;; Lと' 5; 3LPH14; 4567 ;; O' – M3105

+0

@ M3105を取得しようとしています。 – Vaishali

+0

ああ、ありがとう、ありがとう! – M3105

関連する問題