以下数据框包含网络防火墙的配置项。每行代表一个配置项 - 例如,行0
用于object network fake1
,与此关联的唯一参数显示在col_0
中,并且是IP地址字符串host 10.0.0.1
col_0
的进一步向下是一个条目network-object object fake1
,这是指前面提到的object network fake1
(有一个字符串模式可供使用)。我想将文本从IP地址单元格复制到目标单元格,如下所示:
任何人都可以帮我创建一个包含以下所需输出的新数据框:
请注意名称即fake1,fake2,prt-apps等可以更改,但字符串“object network”,“object-group network”和“network-object object”将永远是因此,任何匹配基于交叉引用名称的代码都是理想的,并且可以使用更大的配置进行扩展。
即。它可以是object network foo
和network object object foo
。有一种模式可以匹配,如下文所示。
测试数据重现这一点可以从df.to_dict()
输出中获取:
import pandas as pd
import numpy as np
from numpy import nan
dfData = {'col_0': {'object network fake1': ' host 10.0.0.1',
'object network fake2': ' host 10.0.0.2',
'object network fake3': ' host 10.0.0.3',
'object network fake4': ' host 10.0.0.4',
'object network fake5': ' host 10.0.0.5',
'object-group network prt-apps': ' network-object object fake1',
'object-group network prt-apps2': ' network-object object fake4',
'object-group network prt-apps3': ' network-object object fake5'},
'col_1': {'object network fake1': nan,
'object network fake2': nan,
'object network fake3': nan,
'object network fake4': nan,
'object network fake5': nan,
'object-group network prt-apps': ' network-object object fake2',
'object-group network prt-apps2': ' group-object prt-apps',
'object-group network prt-apps3': ' group-object prt-apps2'},
'col_2': {'object network fake1': nan,
'object network fake2': nan,
'object network fake3': nan,
'object network fake4': nan,
'object network fake5': nan,
'object-group network prt-apps': ' network-object object fake3',
'object-group network prt-apps2': nan,
'object-group network prt-apps3': nan}}
pd.DataFrame(dfData)
我尝试了什么?
我需要花费数小时来解析数据并将其转换为此帖子中的格式。然后我查看了使用pandas的字符串操作,但是str.contains
仅限于Series
并且无法解析整个df。我想过groupby
但不知道如何做到这一点。感谢任何帮助。
任何使用思科防火墙的人都可能会因为对象配置命名约定而找到这篇文章,并且可能会找到一个有用的解决方案。
答案 0 :(得分:1)
可能是正则表达式的组合,str.contains
和str.replace
:
import re
df = pd.DataFrame(dfData)
for index in df.index: #loop through the index values
match = re.search(r'(fake\d)', index) #search for the "fake" + a digit
if match is not None:
fakenumber = match.group(1) #extract fake number ie "fake1"
for col in df.columns:
if True in df[col].str.contains(fakenumber).tolist():
df.loc[:, col] = df[col].str.replace(fakenumber, fakenumber + df.loc[index, 'col_0'])
df