从Dataframe中提取服务器名称并在Python中对其进行分组

时间:2017-10-19 06:57:26

标签: python python-2.7 pandas

我有一个pandas Dataframe。其中我有一个名为“简短描述”的列。 我已经过滤了这一列并列入了一个列表。

我在df中有2500个描述。我的描述如下:

  
      
  • 摘要:SD1:数据库saptempdb中的空闲日志空间不足:2。99%日期:01/01/2017严重性:重要资源
  •   
  • 摘要:SD1:数据库saptempdb中的空闲数据空间不足:2。99%日期:01/01/2017严重性:主要结果
  •   
  • 摘要:数据库FSPRO使用了日志空间:95。00%日期:01/07/2017严重性:主要ResourceId:svf
  •   
  • 无法从GUI
  • 连接BD1和BQ1   

我已完成字符串拆分并保存在列表中

#### Splitting the sentences ####
df['sentsplit'] = df["Short Description"].str.split(" ")
sent = df['sentsplit'].tolist()
  

[[u'Summary:',u'SD1:',u'Low',u'free',u'LOG',你的空间',u'in',u'database',u'saptempdb :','u'2.99%',u'Date:',u'01 / 01/2017',u'Severity:',u'Major',u'Reso'],[u'Summary:',你' SD1:',u'Low',u'free',u'DATA',你的空间',u'in',你的数据库',u'saptempdb:',u'2.99%',u'Date: ',u'01 / 01/2017',u'Severity:','u'Major',u'Res']

我需要提取我的数据库名称并对其进行分组。例如:在第一个描述中 - saptempdb是一个数据库,第二个也是saptempdb。我需要对这些语句进行分组。(基本上需要集群基于相同数据库的描述)。

Summary: SD1: Low free LOG space in database saptempdb: 2.99% Date: 01/01/2017 Severity: Major Reso              SAPTEMPDB
Summary: SD1: Low free DATA space in database saptempdb: 2.99% Date: 01/01/2017 Severity: Major Res               SAPTEMPDB
Summary: Database FSPRO has used log space: 95.00% Date: 01/07/2017 Severity: Major ResourceId: svf              FSPRO
Unable to connect BD1 and BQ1 from GUI         Miscellaneous

我试图使用模式

进行exytract
import re
ip = re.findall( r'[0-9]+(?:\.[0-9]+){3}', sent )
print ip

也试过这个。它始终不遵循这种模式。

host_or_ip_re = re.compile(r'database (\d+:\d+:\d+:\d+)|database (\w+)|Sys=([^, ]+),')
for line in log:
    m = host_or_ip_re.searc( line )
    if m:
        print m.groups()

2 个答案:

答案 0 :(得分:0)

我从您的描述中理解的是,您希望使用相同的数据库名称对所有描述进行分组。对吗?

为此,如果您有一组预定义的数据库名称,则可以创建数据库列表,如db = ['saptempdb','FSPRO','BD1','BQ1']并尝试匹配这些字符串该列表包含数据框而不是对其进行分组。

您正在尝试 - host_or_ip_re = re.compile(r'database (\d+:\d+:\d+:\d+)|database (\w+)|Sys=([^, ]+),')

对于“无法从GUI连接BD1和BQ1”不起作用,因为此语句中没有数据库字符串。

答案 1 :(得分:0)

使用提供的输入的变体:

l = ['Summary: SD1: Low free LOG space in database saptempdb: 2.99% Date: 01/01/2017 Severity: Major Reso ',
     'Summary: Database FSPRO has used log space: 95.00% Date: 01/07/2017 Severity: Major ResourceId: svf ',
     'Summary: SD1: Low free DATA space in database saptempdb: 2.99% Date: 01/01/2017 Severity: Major Res ',
     'Unable to connect BD1 and BQ1 from GUI']

我创建了一个数据框并添加了一个空列

import pandas as pd
frame = pd.DataFrame({'logs': l})
frame['names'] = ''

然后我创建正则表达式以查找数据库名称并使用它来填充names列:

import re
pattern = re.compile(r'[dD]atabase (\w+)')

for _, line in frame.iterrows():
    name = pattern.findall(line['logs'])
    if name:
        line['names'] = name[0]
    else:
        line['names'] = 'Miscellaneous'

最后,我按names

对数据框进行排序
frame.sort_values(by='names', inplace=True)
# frame.sort_values(by='names', inplace=False) returns a sorted copy of f

并获取

                                                logs          names
1  Summary: Database FSPRO has used log space: 95...          FSPRO
3             Unable to connect BD1 and BQ1 from GUI  Miscellaneous
0  Summary: SD1: Low free LOG space in database s...      saptempdb
2  Summary: SD1: Low free DATA space in database ...      saptempdb