Python Pandas условное слияние строк - PullRequest
0 голосов
/ 29 апреля 2018

Я новичок в 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 голосов
/ 14 июня 2018

Если вы загрузите только входную часть (красный квадрат в вашем вопросе) как 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 того же Host name агрегируются в ту же ячейку, что и список

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. Выберите Домой -> Обтекание текста следующим красным квадратом

imageWrap Text">

Это немного долго, но это должно сделать задачу. Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...