#python-3.x #pandas
#python-3.x #pandas
Вопрос:
Я использую pandas str.contains
для расширения поиска по нескольким шаблонам, включая "?"
использование "|"
оператора, который выполняется и выдает правильные результаты.
У меня есть несколько моментов, которые я хотел бы узнать из мнений экспертов следующим образом.
-
Есть ли лучший способ использовать
str.contains
например, поместить все шаблоны поиска в переменную, как показано ниже, я знаю, что это выполнимо, но хотел бы знать, лучше ли использовать это?patt = "AIX|CentOS|RHEL|SunOS|SuSE|Ubuntu|?"
-
Как вы можете видеть, я
*
появляюсь в некоторых именах хостов, можно ли их удалить, например, с помощью pandas ietest-centos71*
Фрагмент кода:
$ cat getsurvey.py
#!/usr/bin/python3
import pandas as pd
##### Python pandas, widen output display to see more columns. ####
pd.set_option('display.height', None)
pd.set_option('display.max_rows', None)
pd.set_option('display.max_columns', None)
pd.set_option('display.width', None)
pd.set_option('expand_frame_repr', True)
##################### END OF THE Display Settings ###################
col_names = ['Hostname', 'IP Address', 'Aux Site', 'CPU Model', 'CDN Version', 'OS Version', 'Kernel Version', 'LDAP Profile']
#df1 = pd.read_csv('host.txt-Org', delimiter = "t", usecols=col_names, encoding='cp1252', low_memory=False)
df1 = pd.read_csv('host.txt-Org', delimiter = "t", usecols=col_names, encoding='cp1252', dtype='unicode')
df2 = df1[df1['OS Version'].str.contains("AIX|CentOS|RHEL|SunOS|SuSE|Ubuntu|?", na=False)][['Hostname', 'IP Address', 'Aux Site', 'OS Version']]
print(df2)
Результат:
$ ./getsurvey.py
Hostname IP Address Aux Site OS Version
5266 test-centos71* NaN NaN ?
9824 test-centos72 192.1.1.126 test ?
9886 test-centos73 192.1.1.36 test ?
11457 test-centos74* 192.1.1.107 test ?
12485 test-centos75* 192.1.11.85 test ?
13187 foreman01 192.1.1.31 test ?
НЕОБРАБОТАННЫЕ ДАННЫЕ:
Hostname IP Address Aux Site CPU Model CDN Version OS Version Kernel Version LDAP Profile
test-centos71* NaN NaN 1x 2.90 GHz Xeon E5-4617 f06.01 RHEL 5.5 2.6.18-194.el5 STD
test-centos72 192.1.1.126 US DC 1x 3.00 GHz Xeon E5-2690 f03.00 RHEL 6.5 2.6.32-431.11.2.el6.x86_6 STD
test-centos76* NaN NaN 1x 2.90 GHz Xeon E5-4617 f06.01 RHEL 5.5 2.6.18-194.el5 STD
ценю ваше время и помощь в области advanced.
Редактировать:
Получил решение для моего второго вопроса, насколько я понимаю, с помощью replace.. это работает нормально, просто откройте, чтобы иметь другие мнения..
df2['Hostname'] = df2['Hostname'].str.replace("*", "")
Комментарии:
1. хотите показать данные?
2. @Wen-Ben, просто предоставил несколько строк необработанных данных, которые имитируют реальные данные.
Ответ №1:
Ну, вы также можете попробовать с replace() и re.sub():
df2['Hostname'] = df2['Hostname'].replace('*', '')
или,
import re
df2['Hostname'] = df2['Hostname'].apply(lambda x: re.sub(r'*', '', x))
Комментарии:
1. Loochie, 1 и спасибо, что задумались, да,
replace
я уже пробовал, это работает нормально, импортre
выглядит здесь немного излишним.