Python Pandas 条件行合并

3
我是一名新手,对Python和Pandas不太了解,过去几周一直在寻找答案,但却遇到了难题。虽然我通常可以在这里或者网络上找到答案,但这次却没有那么幸运。
问题:
我有一个Excel文件,需要循环读取其中的内容来为防火墙创建一个脚本。 第1、2、3行的A列已经合并,包含一个主机名; 第1、2、3行的B列没有合并,每一行分别包含一个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))

这里输入图片描述

提前致谢。


1
谢谢!我已经更新了我的问题。 - Anton
我的解决方案有效吗? - gyoza
嗨gyoza,感谢您提供的解决方案。实际上我正在寻找一种自动扫描带有“if”语句的Excel文件的方法。类似于这样的东西。 - Anton
如果A列已合并,则合并同一行中的B列或类似内容。因此,我想检查单元格是否包含数据以及它是否已合并单元格 - 然后我想合并其右侧所有单元格上相同数量的单元格。例如,在屏幕截图中,您可以看到B列是单个行,但在F列中单元格已合并。谢谢提前。 - Anton
好的,那我删除之前的解决方案,因为看起来不是你需要的。 - gyoza
显示剩余2条评论
1个回答

1
如果你只加载输入部分(问题中的红色方框)作为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地址会被聚合到同一个单元格中,作为一个列表。

df = pd.DataFrame(df.groupby('Host name')['IP address'].apply(list))

此时,df看起来像这样。
           IP address
Host name   
LAX_R      [192.168.1.1, 192.168.1.2, 192.168.1.3]

下一步是删除一些不必要的字符。
df.columns = ['IP address']
for ch in ["[", "]", ",", "'"]:
    df['IP address'] = df['IP address'].apply(lambda x: str(x).replace(ch, ""))

(可选)对于“Apache Open Office”,将每个IP地址显示在新行中的方法是

df['IP address'] = df['IP address'].apply(lambda x: x.replace(" ", "\n"))

最后保存它。
df.to_excel("yourfile.xlsx", index=True)

(附录) 对于“Microsoft Office”,每个IP地址显示在新行中是通过以下方式实现的

  1. 跳过上面的“可选”部分
  2. 选择“IP地址”列
  3. 选择主页-->文本换行,如下图所示的红色方框

Choose Home-->Wrap Text

虽然有点冗长,但它应该可以完成任务。 希望能对您有所帮助。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接