Как сохранить результат нескольких циклов for в фрейме данных? - PullRequest
0 голосов
/ 24 мая 2019

Как добавить выходные данные различных циклов for в один кадр данных.Например, я удалил данные с веб-сайта и у меня есть список имен, адресов электронной почты и номера телефонов с использованием циклов.Я хочу добавить все выходные данные в таблицу в одном кадре данных.Я могу сделать это для одного цикла, но не для нескольких циклов.Пожалуйста, посмотрите на код и вывод в прикрепленных изображениях.

Удалив Zip из цикла for, выдает ошибку.«Слишком много значений для распаковки»

  1. Loop
phone = soup.find_all(class_ = "directory_item_phone directory_item_info_item")
for phn in phone:
    print(phn.text.strip())
##Output - List of Numbers
Код для df
df = list()
for name,mail,phn in zip(faculty_name,email,phone):
    df.append(name.text.strip())
    df.append(mail.text.strip())
    df.append(phn.text.strip())
df = pd.DataFrame(df)
df

Для циклов Код и выход для df

Ответы [ 2 ]

0 голосов
/ 24 мая 2019

Эффективный способ создания pandas.DataFrame - сначала создать dict, а затем преобразовать его в DataFrame.

В вашем случае вы, вероятно, могли бы сделать:

import pandas as pd

D = {'name': [], 'mail': [], 'phone': []}

for name, mail, phn in zip(faculty_name, email, phone):
    D['name'].append(name.text.strip())
    D['mail'].append(mail.text.strip())
    D['phone'].append(phn.text.strip())

df = pd.DataFrame(D)

Другой способ с лямбда-функцией:

import pandas as pd

text_strip = lambda s : s.text.strip()

D = {
        'name': list(map(text_strip, faculty_name)),
        'mail': list(map(text_strip, email)),
        'phone': list(map(text_strip, phone))
        }

df = pd.DataFrame(D)

Если списки не имеют одинаковую длину, вы можете попробовать это (но я не уверен, что это очень эффективно):

import pandas as pd

columns_names = ['name', 'mail', 'phone']
all_lists = [faculty_name, email, phone]

max_lenght = max(map(len, all_lists))  
D = {c_name: [None]*max_lenght for c_name in columns_names}

for c_name, l in zip(columns_names , all_lists):
    for ind, element in enumerate(l):
        D[c_name][ind] = element

df = pd.DataFrame(D)
0 голосов
/ 24 мая 2019

Попробуйте это,

data = {'name':[name.text.strip() for name in faculty_name],
        'mail':[mail.text.strip() for mail in email],
        'phn':[phn.text.strip() for phn in phone],}

df = pd.DataFrame.from_dict(data)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...