我是python和Pandas的新手,过去几周我一直在寻找这个答案,但我碰到了一堵砖墙。虽然,我通常在这里或网上的其他地方找到我的答案 - 这次我不幸运。
问题:
我有一个excel文件,我需要循环创建一个防火墙脚本。
列A,行1,2,3已合并,并包含一个主机名 B列,第1,2,3行未合并,每行包含一个IP地址
如何写一个条件来说明A列是否有任何合并的行,然后检查并合并B列中的同一行?
import pandas as pd
df = pd.read_excel('file.xlsx',sheetname="sheet_name")
df1 = df['Unnamed: 2'].dropna().drop([6,7]) # Unanamed is the column ID then Delete empty cell's and delete row 6&7
df2 = df['Unnamed: 4'].dropna().drop([6,7]) # Unanamed is the column ID then Delete empty cell's and delete row 6&7
for a, b in zip(df1,df2):
# The condition I am looking for, please note the code below is not correct
if a is merged then merge b:
print('Hostname {} ip address {}'.format(a,b))
提前谢谢。
答案 0 :(得分:0)
如果您只将输入部分(问题中的红色方块)加载为df
,并且合并了列'Host name'
,它将如下所示(df
)
Host name IP address
LAX_R 192.168.1.1
NaN 192.168.1.2
NaN 192.168.1.3
顺便说一下,您可以检查列'Host name'
是否最初合并,方法是检查它是否包含NaN
值(注意:我假设不应该NaN
}值,如果它最初没有合并):
if sum(df['Host name'].isnull()) > 0:
然后,通过向前填充NaN,
df.ffill(inplace=True)
我们得到了
Host name IP address
LAX_R 192.168.1.1
LAX_R 192.168.1.2
LAX_R 192.168.1.3
之后,相同IP address
的{{1}}会聚合到与列表相同的单元格
Host name
此时,df看起来像这样
df = pd.DataFrame(df.groupby('Host name')['IP address'].apply(list))
下一步是删除一些不必要的字符
IP address
Host name
LAX_R [192.168.1.1, 192.168.1.2, 192.168.1.3]
(可选)对于" Apache Open Office",在新行中显示每个IP地址由
完成df.columns = ['IP address']
for ch in ["[", "]", ",", "'"]:
df['IP address'] = df['IP address'].apply(lambda x: str(x).replace(ch, ""))
最后保存。
df['IP address'] = df['IP address'].apply(lambda x: x.replace(" ", "\n"))
(附录) 对于" Microsoft Office",在新行中显示每个IP地址由
完成