【问题标题】:How do I save result of multiple “for” loops into a dataframe?如何将多个“for”循环的结果保存到数据框中?
【发布时间】:2019-10-10 18:08:12
【问题描述】:

如何将不同 for 循环的输出添加到一个数据帧中。例如,我从网站上抓取了数据,并使用循环列出了姓名、电子邮件和电话号码。我想将所有输出添加到单个数据框中的表中。 我可以为一个循环做到这一点,但不能为多个循环做到这一点。 请查看附件中的代码和输出。

从 for 循环中删除 Zip 会导致错误。 “要解压的值太多”

  1. 循环
phone = soup.find_all(class_ = "directory_item_phone directory_item_info_item")
for phn in phone:
    print(phn.text.strip())
##Output - List of Numbers
  1. 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

For loops Code and Output for df

【问题讨论】:

  • 邮政编码作为问题的一部分作为文本。没有链接。
  • 请将代码以文本形式而非图片形式发布。

标签: python python-3.x pandas for-loop beautifulsoup


【解决方案1】:

试试这个,

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)

【讨论】:

  • 它给了我这个错误 - AssertionError: 3 列通过,传递的数据有 2 列
  • pd.DataFrame() 中添加index=False。请确认它是否有效?
  • 我收到此错误 - ValueError: 数组的长度必须相同。列表长度不同,我查看了 HTML 页面,只给出了 4 个电话号码。
【解决方案2】:

创建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)

使用 lambda 函数的另一种方式:

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)

【讨论】:

  • Dictionary 方法有效,但是当我检查数据框时出现了一个问题,它只显示 4 行而不是 6 行,因为姓名、邮件和电话号码各有 6 个条目。虽然第二种方法给了我“错误 - 数组必须都是相同的长度”。我处于学习阶段,所以还不知道 lambda 函数。感谢您的快速回复。
  • 对不起,我的错。我刚刚检查了 HTML,只给出了 4 个数字。感谢您的帮助。
  • 有办法解决这个问题吗?是否可以添加空值或零值来代替缺失值?
  • 您确定您的列表长度都相同吗?对于第二种方法,lambda 函数可能不是最合适的方法,请参阅带有列表理解的 shaik moeed 响应,这肯定更好
  • 不,它们的长度不相等,我检查了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-24
  • 1970-01-01
  • 2022-01-20
相关资源
最近更新 更多