Перебор столбцов фрейма данных и переменных цикла

#python #pandas #loops #dataframe

#python #pandas #циклы #фрейм данных

Вопрос:

Я новичок в Python, поэтому извините меня. Когда я был в PHP / MySQL. Я мог бы перебирать таблицу на основе любого параметра. Давайте просто скажем ID для упрощения. Как только вы найдете идентификатор, вы можете поместить каждый столбец в переменную. Просто…

Итак, я создал CSV и загрузил в фрейм данных с помощью Pandas.

 switch_id,vlan_num,vlan_desc,int_vlan,int_vlan_ip,int_vlan_mask
1,20,Legal,20,192.168.20.1,255.255.255.0
1,21,HumanResources,21,192.168.21.1,255.255.255.0
2,20,Legal,20,192.168.20.2,255.255.255.0
2,21,HumanResources,21,192.168.21.2,255.255.255.0
  

Код, который я использую, выглядит следующим образом в качестве теста для понимания функциональности.

 import pandas as pd
df = pd.read_csv('/Users/thenk83/Desktop/PythonCode/vlan_database.txt')
for i in df:
print(df[i][2])
  

Вариант заключается в следующем:

 1
22
Finance
22
192.168.22.1
255.255.255.0
  

Как мне сделать так, чтобы я мог использовать row[‘switch_id’], row[‘vlan_num’] и т.д. и т.п. В принципе, я хочу поместить каждый столбец в строке в переменную. Я хочу вызвать каждую переменную самостоятельно. Я не хочу выводить всю строку в одной переменной. Я вижу, как вызывается строка, но как мне выбрать столбец. Так запутался.

В принципе, я хочу настроить несколько коммутаторов Cisco. Перебор каждой строки в фрейме данных и подключение данных к конфигурациям, где это необходимо.

Я мог бы легко сделать это с помощью Php и MySQL, но это не одно и то же. Итак, я не понимаю, как это сделать.

Я бы предпочел ничего сложного. Было бы здорово, если бы вы могли мне помочь, как можно проще. Я хотел бы понять.

Ответ №1:

IIUC, я думаю, вы ищете DataFrame.iterrows .

Это даст тот же результат, что и ваше решение:

 value_list = ['1']
df = df[df.switch_id.isin(value_list)]

for idx, row in df.iterrows():
    print(row['vlan_num'],
          row['vlan_desc'],
          row['int_vlan'],
          row['int_vlan_ip'],
          row['int_vlan_mask'])
  

Ответ №2:

Я понял это после еще нескольких проб и ошибок. В итоге я использовал «.iloc».

 import pandas as pd

df = pd.read_csv('/Users/thenk83/Desktop/PythonCode/vlan_database.txt')
value_list = ['1']
df = df[df.switch_id.isin(value_list)]
for i in range(len(df)):
    vlan_num = df.iloc[i,1]
    vlan_name = df.iloc[i,2]
    int_vlan = df.iloc[i,3]
    int_vlan_ip = df.iloc[i,4]
    int_vlan_mask = df.iloc[i,5]
    print(vlan_num,vlan_name,int_vlan,int_vlan_ip,int_vlan_mask)
  

Вероятно, это не самый чистый способ сделать это, но пока он будет работать. Но это дает мне это:

 (20, 'Legal', 20, '192.168.20.1', '255.255.255.0')
(21, 'HumanResources', 21, '192.168.21.1', '255.255.255.0')
(22, 'Finance', 22, '192.168.22.1', '255.255.255.0')
(23, 'Facilities', 23, '192.168.23.1', '255.255.255.0')
(24, 'InformationTechnology', 24, '192.168.24.1', '255.255.255.0')
(25, 'Engineering', 25, '192.168.25.1', '255.255.255.0')
  

И это именно то, что я хотел!

Ответ №3:

Поскольку вы не выполняете никаких математических или статистических операций с вашими данными, почему бы вам не использовать csv модуль. Например, на основе вашего кода:

Input_file.csv

 switch_id,vlan_num,vlan_desc,int_vlan,int_vlan_ip,int_vlan_mask
1,20,Legal,20,192.168.20.1,255.255.255.0
1,21,HumanResources,21,192.168.21.1,255.255.255.0
2,20,Legal,20,192.168.20.2,255.255.255.0
2,21,HumanResources,21,192.168.21.2,255.255.255.0
  

Answer.py

 import csv

input_file_name = "Input_file.csv"

with open(input_file_name, newline='') as input_file:
    csv_reader = csv.DictReader(input_file)
    for row in csv_reader:
        print(row['vlan_num'],
              row['vlan_desc'],
              row['int_vlan'],
              row['int_vlan_ip'],
              row['int_vlan_mask'])