Python Pandas条件行合并

时间:2018-04-29 02:28:42

标签: python excel pandas

我是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))

enter image description here

提前谢谢。

1 个答案:

答案 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地址由

完成
  1. 跳过(可选)部分
  2. 选择列" IP地址"
  3. 选择主页 - >将文字换行为以下红色方块
  4. Choose Home-->Wrap Text

    它有点冗长,但它应该完成任务。 希望它有所帮助。