使用Pandas筛选网页表格中值属于指定数组的DataFrame
解决Pandas筛选HTML表格DataFrame的问题
问题根源
你遇到的核心问题是网页表格的表头结构和Pandas默认解析逻辑不匹配:网页里<thead>的行是占位用的0、1、2、3,实际表头(Date、Name等)在<tbody>的第一行。直接用read_html解析后,DataFrame的列名是数字,而非你期望的Number这类名称,导致df.Number无法定位到目标列。
修正步骤与代码
1. 处理单个表格的筛选
先正确解析表格结构,再筛选目标行:
import pandas as pd url = 'https://some_website.com' # 获取网页中所有表格的DataFrame列表 dfs = pd.read_html(url) # 取出第一个目标表格 df = dfs[0] # 重置列名为实际表头(tbody第一行的内容) df.columns = df.iloc[0] # 跳过原表头行,保留真实数据 df = df[1:] # 重置索引避免混乱 df = df.reset_index(drop=True) # 指定要匹配的数值数组 arr_Nr = ['3290', '9273'] # 筛选Number列包含目标值的行 filtered_df = df[df['Number'].isin(arr_Nr)] print(filtered_df)
2. 筛选整个DataFrame列表中符合条件的表格
如果网页有多个表格,需要遍历检查每个表格是否存在目标值:
def get_matching_dfs(df_list, target_values): matching_dfs = [] for df in df_list: # 复制并处理当前表格的表头 temp_df = df.copy() temp_df.columns = temp_df.iloc[0] temp_df = temp_df[1:].reset_index(drop=True) # 检查表格中是否有单元格属于目标数组 if temp_df.isin(target_values).any().any(): matching_dfs.append(temp_df) return matching_dfs # 获取所有符合条件的DataFrame matching_dfs = get_matching_dfs(dfs, arr_Nr) for idx, match_df in enumerate(matching_dfs): print(f"--- 符合条件的表格 {idx+1} ---") print(match_df)
关键说明
- 用
df.iloc[0]提取真实表头,重新赋值给df.columns,才能通过列名(如Number)定位数据列。 - 使用
isin()方法替代单个值判断,更适合多值数组的筛选场景。 - 处理表头后必须跳过原表头行(
df[1:]),避免表头内容混入数据影响筛选。
内容的提问来源于stack exchange,提问作者senior_freshman
相关产品推荐
相关产品推荐

