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

从Dataframe中提取服务器名称并在Python中对其进行分组,python,python-2.7,pandas,Python,Python 2.7,Pandas,我有一个熊猫数据框。其中我有一个名为“简短描述”的专栏。 我已经过滤了这个专栏,并加入了一个列表 我有2500个df描述。我的描述如下所示: 摘要:SD1:数据库saptempdb中可用日志空间不足:2.99%日期:2017年1月1日严重性:主要原因 摘要:SD1:数据库saptempdb中可用数据空间不足:2.99%日期:2017年1月1日严重性:主要恢复 摘要:数据库FSPRO已使用日志空间:95.00%日期:2017年7月1日严重性:主要资源ID:svf 无法从GUI连接BD1和BQ1

我有一个熊猫数据框。其中我有一个名为“简短描述”的专栏。 我已经过滤了这个专栏,并加入了一个列表

我有2500个df描述。我的描述如下所示:

  • 摘要:SD1:数据库saptempdb中可用日志空间不足:2.99%日期:2017年1月1日严重性:主要原因
  • 摘要:SD1:数据库saptempdb中可用数据空间不足:2.99%日期:2017年1月1日严重性:主要恢复
  • 摘要:数据库FSPRO已使用日志空间:95.00%日期:2017年7月1日严重性:主要资源ID: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'space'、u'in'、u'database'、u'SAPTEMDB:'、u'2.99%、u'Date:'、u'01/2017'、u'Severity:'、u'Major'、u'Reso']、[u'Summary:'、u'SD1:'、u'Low'、u'free'、u'DATA'、u'space'、u'in'、u'database'、u'SAPTEMDB:'、u'2.99%、u'Date:'、u'01/01/2017'、u'Res']

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

我试着用这个图案来画画

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()

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

为此,如果您有一组预定义的数据库名称,则可以创建一个数据库列表,如db=['saptemdb','FSPRO','BD1','BQ1',],并尝试将该列表中的这些字符串与数据帧匹配,然后将其分组

您正在尝试重新编译(r'database(\d+:\d+:\d+:\d+);database(\w+);Sys=([^,]+),”)


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

使用所提供输入的变体:

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']
我创建了一个dataframe并添加了一个空列

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

您指的是pandas dataframe吗?关于问题本身,您是否尝试过一些东西,或者您是在要求他人为您做这项工作?提示:不要拆分字符串并使用来提取数据库名称。@Francesco:嗨。谢谢您的回复。为了澄清,我没有要求他人为我工作:):)。我尝试过几次。但我没有成功。我的方法甚至可能是错误的。在这里我将其粘贴到问题中:)如果消息始终是“database”或“database”,则regex应该能够为您获取名称。您能用“我需要对这些语句进行分组”来扩展您的意思吗用一个与输入数据相关的例子?@Francesco:请看这个问题。我用一个分组描述的例子进行了编辑,这很有帮助。谢谢。我怎么能认为这个答案有帮助?
                                                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