从Dataframe中提取服务器名称并在Python中对其进行分组
我有一个熊猫数据框。其中我有一个名为“简短描述”的专栏。 我已经过滤了这个专栏,并加入了一个列表 我有2500个df描述。我的描述如下所示:从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
- 摘要: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