Pandas调用df出现行重复异常,数据行数从100变800求助
问题:爬取维基百科表格后DataFrame行数异常增多(100行→800行)
已确认执行for循环前所有数据正常,爬取的目标维基百科表格仅含100行数据,但最终生成的DataFrame行数变为800行。循环过程中输出的有效数据是100行,无法定位行数膨胀的原因。
问题代码
table1 = soup.find_all('table')[1] print(table1) table1_headers = table1.find_all('th') print(table1_headers) processed_t1h = [t1h_data.text.strip() for t1h_data in table1_headers] processed_t1h import pandas as pd df = pd.DataFrame(columns = processed_t1h) df column_data = table1.find_all('tr') column_data for row in column_data[1:]: row_data = row.find_all('td') individual_row_data = [data.text.strip() for data in row_data] print(individual_row_data) length = len(df) finaldata = df.loc[length] = individual_row_data print(finaldata) df
问题根源
核心问题出在两个地方:
find_all('tr')抓取了无效行:维基百科的表格里存在嵌套的<tr>标签(比如合并单元格的隐藏行、引用标注行),column_data = table1.find_all('tr')会把所有层级的<tr>都提取出来,导致column_data[1:]的实际长度远大于100。df.loc[length]的索引逻辑缺陷:即使individual_row_data是空列表(无效行),df.loc[length]也会强制创建新行,填充NaN值。循环次数远多于有效数据行数,最终导致DataFrame行数膨胀到800。
解决方案
方案1:过滤有效数据行(修复原代码)
只保留列数与表头匹配的行,避免无效行插入:
table1 = soup.find_all('table')[1] table1_headers = table1.find_all('th') processed_t1h = [t1h_data.text.strip() for t1h_data in table1_headers] import pandas as pd df = pd.DataFrame(columns=processed_t1h) column_data = table1.find_all('tr') expected_col_num = len(processed_t1h) # 有效数据行应包含的列数 for row in column_data[1:]: row_data = row.find_all('td') individual_row_data = [data.text.strip() for data in row_data] # 仅处理列数匹配的有效行 if len(individual_row_data) == expected_col_num: df.loc[len(df)] = individual_row_data print(df.shape) # 输出应为(100, 列数)
方案2:用pandas直接读取HTML(更高效)
pandas自带read_html方法,能自动解析维基百科的表格结构,无需手动处理标签:
import pandas as pd # 直接读取页面第2个表格(索引为1) df = pd.read_html('https://en.wikipedia.org/wiki/List_of_largest_companies_in_the_United_States_by_revenue')[1] print(df.shape) # 输出(100, 7),符合实际行数
内容的提问来源于stack exchange,提问作者TheLordNeedsHelp
相关产品推荐
相关产品推荐

