簡體   English   中英

Python:如何刪除以某些字符結尾的行?

[英]Python: How to delete rows ending in certain characters?

我有一個大型數據文件,我需要刪除以某些字母結尾的行。

這是我正在使用的文件的示例:

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行因為它們以DA和PL結束。

你可以使用這個表達式

df = df[~df['User Name'].str.contains('(?:DA|PL)$')]

它將返回所有不以DA或PL結尾的行。

?:是這樣括號不會捕獲任何東西。 否則,您會看到pandas返回以下(無害)警告:

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

或者,使用endswith()並且沒有正則表達式,可以使用以下表達式實現相同的過濾:

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

正如所料,沒有正則表達式的版本會更快。 一個簡單的測試,由big_df組成,由原始df的10001個副本組成:

# 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

你可以使用一個布爾掩碼來檢查User_Name的最后兩個字符是否在一組兩個字符結尾的非( ~ )中:

>>> 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...

您可以使用endswith()方法檢查字符串是否以特定模式結束,而不是regular expressions

即:

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

您應該使用篩選的數據創建另一個df,然后使用pd.to_csv()來保存文件的干凈版本。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM