2016-06-22 5 views
1

У меня есть большой файл данных, и мне нужно удалить строки с определенными ключевыми словами.Удаление строк с определенными ключевыми словами из файла csv

Вот пример файла я использую:

User Name  DN 
MB31212  CN=MB31212,CN=Users,DC=prod,DC=trovp,DC=net 
MB23423  CN=MB23423 ,OU=Generic Mailbox,DC=prod,DC=trovp,DC=net 
MB23424  CN=MB23424 ,CN=Users,DC=prod,DC=trovp,DC=net 
MB23423  CN=MB23423,OU=DNA,DC=prod,DC=trovp,DC=net 
MB23234  CN=MB23234 ,OU=DNA,DC=prod,DC=trovp,DC=net 

Это, как я импортировать файл:

import pandas as pd 
df = pd.read_csv('sample.csv', sep=',', encoding='latin1') 

Как

  1. Удалить все строки, например, содержать «OU = DNA» в столбце DN?
  2. Как удалить первый атрибут «CN = x» в столбце DN без удаления остальной части данных в столбце?

Я хотел бы получить что-то вроде того, что опубликовано ниже, с 2-х строк, содержащих «OU = ДНК» удаленных и «CN = х» удаляется из каждой строки:

User Name  DN 
MB31212  CN=Users,DC=prod,DC=trovp,DC=net 
MB23423  OU=Generic Mailbox,DC=prod,DC=trovp,DC=net 
MB23424  CN=Users,DC=prod,DC=trovp,DC=net 
+0

Я хотел бы предложить, глядя в Grep удалить строки и awk для удаления столбцов – lhoworko

ответ

3

You может попробовать эту двухступенчатую фильтрацию в качестве вашей логики. Используйте метод str.contains, чтобы отфильтровать строки с OU=DNA и использовать str.replace метод с регулярным выражением для обрезки ведущей CN=x:

newDf = df.loc[~df.DN.str.contains("OU=DNA")] 
newDf.DN = newDf.DN.str.replace("^CN=[^,]*,", "") 
newDf 

    UserName DN 
0 MB31212 CN=Users,DC=prod,DC=trovp,DC=net 
1 MB23423 OU=Generic Mailbox,DC=prod,DC=trovp,DC=net 
2 MB23424 CN=Users,DC=prod,DC=trovp,DC=net 

Немного ломаются регулярного выражения: ^ обозначает начало строки, за которым следует по CN= и использовать [^,]*, для захвата картины до первой запятой;

+0

Я получаю там ошибку «TypeError: неправильный тип операнда для унарного ~:« float »« Когда я использую это. ИТ работает с образцами данных, но я использую большой файл данных. Любая помощь в этом? – JetCorey

+0

Вероятно, ваш фрейм данных содержит отсутствующие значения. Удалите или дважды проверьте, прежде чем применять метод 'contains', чтобы решить проблему. – Psidom

+0

Да, некоторые Пользовательские имена не имеют никакой информации. Если мне нужно сохранить их ... тогда я не могу использовать содержит? – JetCorey

1

Чтобы прочитать образец файла, который вы дали я использовал:

df = pd.read_csv('sample.csv', sep='  ', encoding='latin1', engine="python") 

, а затем:

df = df.drop(df[df.DN.str.contains("OU=DNA")].index) 
df.DN = df.DN.str.replace('(CN=MB[0-9]{5}\s*,)', '') 
df 

дали желаемого результата:

User Name DN 
0 MB31212  CN=Users,DC=prod,DC=trovp,DC=net 
1 MB23423  OU=Generic Mailbox,DC=prod,DC=trovp,DC=net 
2 MB23424  CN=Users,DC=prod,DC=trovp,DC=net 
+0

, это сработало с использованием файла примера .. но я использую большой файл данных .. ошибка, которая возникает: «ValueError: не может индексировать вектор, содержащий значения NA/NaN». Есть несколько строк, которые пусты и не содержат в них никакой информации. Любая помощь в этом? – JetCorey

Смежные вопросы