2016-07-28 7 views
9

大きなデータファイルがあり、特定の文字で終わる行を削除する必要があります。Python:特定の文字で終わる行を削除するには?

User Name  DN 
MB212DA  CN=MB212DA,CN=Users,DC=prod,DC=trovp,DC=net 
MB423DA  CN=MB423DA,OU=Generic Mailbox,DC=prod,DC=trovp,DC=net 
MB424PL  CN=MB424PL,CN=Users,DC=prod,DC=trovp,DC=net 
MBDA423  CN=MBDA423,OU=DNA,DC=prod,DC=trovp,DC=net 
MB2ADA4  CN=MB2ADA4,OU=DNA,DC=prod,DC=trovp,DC=netenter code here 

コード私が使用しています:私は終わる単語を削除するには、正規表現構文を使用するにはどうすればよい

from pandas import DataFrame, read_csv 
import pandas as pd 
f = pd.read_csv('test1.csv', sep=',',encoding='latin1') 
df = f.loc[~(~pd.isnull(f['User Name']) & f['UserName'].str.contains("DA|PL",))] 

「ここ

は、私が使用しているファイルの一例ですDA "と" PL "が含まれているので、他の行を削​​除しないようにしてください。

これは、行を削除する必要がありますし、私はこのようなファイルで終わる:彼らはDAとPLに終わったので、

User Name  DN 
MBDA423  CN=MBDA423,OU=DNA,DC=prod,DC=trovp,DC=net 
MB2ADA4  CN=MB2ADA4,OU=DNA,DC=prod,DC=trovp,DC=net 

まず3行が削除されます。

答えて

7

あなたがこの表現に

df = df[~df['User Name'].str.contains('(?:DA|PL)$')] 
を使用することができます

これは、DAまたはPLで終わらない行をすべて返します。

?:は、角かっこが何もキャプチャしないようになっています。あるいは、

UserWarning: This pattern has match groups. To actually get the groups, use str.extract. 

endswith()を使用し、正規表現せずに、同じフィルタリングは、以下の式使用することによって達成することができます:

df = df[~df['User Name'].str.endswith(('DA', 'PL'))] 

をそうしないと、パンダは、以下の(無害)警告を返す参照してくださいね予想どおり、正規表現のないバージョンは高速になります。あなたの元dfの10001のコピーで構成されていbig_dfからなる簡単なテスト、:

# Create a larger DF to get better timing results 
big_df = df.copy() 

for i in range(10000): 
    big_df = big_df.append(df) 

print(big_df.shape) 

>> (50005, 2) 

# Without regular expressions 
%%timeit 
big_df[~big_df['User Name'].str.endswith(('DA', 'PL'))] 

>> 10 loops, best of 3: 22.3 ms per loop 

# With regular expressions 
%%timeit 
big_df[~big_df['User Name'].str.contains('(?:DA|PL)$')] 

>> 10 loops, best of 3: 61.8 ms per loop 
+0

は、正規表現を受け入れendswithませんか?私はそれがフードの下で1つを使用すると思う。 –

+0

私もそうだと思っていました。最初の引数はパターンですが、正規表現を認識することはできませんでした。 –

+1

@AndyHayden明らかにそれはタプルを取る。 –

0

regular expressionsの代わりに、endswith()メソッドを使用して、文字列が特定のパターンで終了するかどうかを確認できます。

すなわち:

for row in rows: 
    if row.endswith('DA') or row.endswith('PL'): 
     #doSomething 

あなたはフィルタリングされたデータを使用して別のDFを作成し、ファイルのクリーンバージョンを保存するためにpd.to_csv()を使用する必要があります。 User_Nameの最後の2つの文字はない(~)であるかどうかをチェックすることにより

2

あなたは、2つの文字の語尾のセットにブールマスクを使用することができます。

>>> df[~df.User_Name.str[-2:].isin(['DA', 'PA'])] 
    User_Name             DN 
2 MB424PL CN=MB424PL, CN=Users, DC=prod, DC=trovp, DC=net 
3 MBDA423  CN=MBDA423, OU=DNA, DC=prod, DC=trovp, DC=net 
4 MB2ADA4 CN=MB2ADA4, OU=DNA, DC=prod, DC=trovp, DC=nete... 
関連する問題