Как pandas может добавить поиск «?» с помощью str.contains

#python-3.x #pandas

#python-3.x #pandas

Вопрос:

Я использую pandas str.contains для расширения поиска по нескольким шаблонам, включая "?" использование "|" оператора, который выполняется и выдает правильные результаты.

У меня есть несколько моментов, которые я хотел бы узнать из мнений экспертов следующим образом.

  1. Есть ли лучший способ использовать str.contains например, поместить все шаблоны поиска в переменную, как показано ниже, я знаю, что это выполнимо, но хотел бы знать, лучше ли использовать это?

    patt = "AIX|CentOS|RHEL|SunOS|SuSE|Ubuntu|?"

  2. Как вы можете видеть, я * появляюсь в некоторых именах хостов, можно ли их удалить, например, с помощью pandas ie test-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 выглядит здесь немного излишним.