我有一个大数据文件,我需要删除以某些字母结尾的行。
这是我正在使用的文件的示例:
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结尾的行。
该?:
是让括号不会捕捉任何东西。否则,您会看到熊猫返回以下(无害)警告:
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
,其中包含10001份原件的副本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
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句