如何将循环生成的多个字典合并为单个Pandas DataFrame
解决方法
核心逻辑是先收集所有单条数据字典到同一个列表中,再一次性转换为DataFrame,避免循环中每次生成独立小表。
注意:不要使用dict作为变量名,这是Python内置类型的关键字,会覆盖原生字典功能引发后续报错。
修改后的完整代码如下:
import pandas as pd import urllib.parse from bs4 import BeautifulSoup # 循环外先初始化空列表存储所有行数据 data_list = [] for l in soup.find_all('a'): link = l.get('href') if link.count('2021') == 1: stuff = urllib.parse.urlsplit(link) stuff = stuff.path.split('/') if stuff[1] == '2021': # 无需转numpy数组,split返回的本身就是列表,可直接按索引取值 year = stuff[1] month = stuff[2] day = stuff[3] category = stuff[4] # 如果需要把关键词列表合并为字符串可以用join,不需要则直接保留stuff[5:7] keywords = '/'.join(stuff[5:7]) row_dict = {'year': year, 'month': month, 'day': day, 'category': category, 'keywords': keywords} data_list.append(row_dict) # 循环结束后一次性生成完整DataFrame full_df = pd.DataFrame(data_list) # 你当前输出有大量重复行,需要去重可以打开下面注释 # full_df = full_df.drop_duplicates().reset_index(drop=True) # 输出查看结果 print(full_df)
额外说明:
- 该方法比循环中逐次生成小DataFrame再拼接的性能高很多,数据量越大优势越明显
- 去掉了原代码中冗余的
list(stuff)、np.array(stuff)操作,运行效率更高 - 如果需要保留keywords为列表格式,删除
'/'.join()包裹直接赋值keywords = stuff[5:7]即可
内容的提问来源于stack exchange,提问作者Robin5454
相关产品推荐
相关产品推荐

