如何编辑pandas.read_html生成的DataFrame并转换为指定格式列表?
解决pandas read_html结果转换为目标列表的问题
我明白你现在的困扰:用read_html()拿到的是DataFrame列表,要把它处理成特定格式的嵌套列表才能写入MS SQL表。咱们一步步拆解解决这个问题:
首先,先明确你的数据结构:read_html()返回的列表里只有一个目标DataFrame,所以第一步先把它单独提取出来。之后我们需要处理NaN值、修改Plan列的内容,还要添加行号,最后转换成你要的格式。
完整处理代码
import requests import pandas as pd r = requests.get('URL') pd.set_option('max_rows',10000) # 1. 从read_html返回的列表中取出目标DataFrame df_list = pd.read_html(r.content) df = df_list[0] # 你的输出里只有一个DataFrame,所以取索引0的元素 # 2. 处理Plan列:把551替换成NP_551,保留not(selected)不变 df[2] = df[2].apply(lambda x: f'NP_{x}' if x == 551 else x) # 3. 把所有NaN值转换成字符串'NaN'(和目标格式一致) df = df.fillna('NaN') # 4. 添加行号列,从1开始计数(对应目标列表的第一个元素) df['row_num'] = range(1, len(df) + 1) # 5. 调整列顺序,让行号放在第一个位置,然后是原来的四列 df = df[['row_num', 0, 1, 2, 3]] # 6. 转换成目标格式的嵌套列表 result_list = df.values.tolist() # 打印验证结果 print(result_list)
代码细节解释
- 提取目标DataFrame:
read_html()会返回网页中所有表格对应的DataFrame列表,你的场景里只有一个目标表格,所以用df_list[0]提取出来单独处理。 - 修改Plan列:用
apply()遍历Plan列(对应DataFrame的第2列),判断值为551时自动添加NP_前缀,其他值比如not(selected)保持原样。 - 统一NaN显示:用
fillna('NaN')把DataFrame里的所有缺失值转换成字符串形式的'NaN',和你要的目标列表格式完全匹配。 - 添加行号:生成从1开始的连续序号,作为每个子列表的第一个元素,符合你给出的示例结构。
- 调整列顺序:确保最终的列顺序是
行号 → Number → Name → Plan → 空列,和目标列表的结构完全对齐。 - 转换为嵌套列表:
values.tolist()会把处理好的DataFrame直接转换成你需要的嵌套列表格式,拿到后就可以直接写入MS SQL表了。
运行这段代码后,你得到的result_list就完全符合预期格式了。
内容的提问来源于stack exchange,提问作者johnred
相关产品推荐
相关产品推荐

