如何从列表生成单键多值Python字典并转为多行Pandas DataFrame
问题解决:从列表生成多值字典并转为多行DataFrame
你的代码之所以生成单行结果,是因为构造results字典时,把missing_list和bad_status_list又嵌套了一层列表(比如[missing_list]),导致Pandas将整个列表视为单个单元格的值,最终输出单行数据。
修正方案1:生成两列多行的DataFrame
如果希望每种状态对应一列,每行显示一个资产标签,直接去掉字典值的嵌套列表即可:
import pandas as pd # 读取数据 in_stock = pd.read_csv("instock.csv") new_data = pd.read_csv("new_data.csv") # 提取资产标签列表 in_stock_list = in_stock.asset_tag.to_list() new_data_list = new_data.asset_tag.to_list() # 筛选缺失和状态异常的资产 missing_list = [item for item in in_stock_list if item not in new_data_list] bad_status_list = [item for item in new_data_list if item not in in_stock_list] # 构造无嵌套的字典 results = { "Missing Assets": missing_list, "Wrong Status": bad_status_list } # 转换为DataFrame,自动对齐行数,缺失值填充NaN df = pd.DataFrame(results)
修正方案2:生成单列多行(含状态标注)
如果需要将所有资产标签放在同一列,同时标注状态类型,可构造包含状态和标签的元组列表,再转换为DataFrame:
import pandas as pd # 读取数据与筛选逻辑同上 in_stock = pd.read_csv("instock.csv") new_data = pd.read_csv("new_data.csv") in_stock_list = in_stock.asset_tag.to_list() new_data_list = new_data.asset_tag.to_list() missing_list = [item for item in in_stock_list if item not in new_data_list] bad_status_list = [item for item in new_data_list if item not in in_stock_list] # 构造包含状态类型的数据集 missing_records = [("Missing Assets", tag) for tag in missing_list] bad_status_records = [("Wrong Status", tag) for tag in bad_status_list] all_records = missing_records + bad_status_records # 转换为单列(资产标签)加状态列的DataFrame df = pd.DataFrame(all_records, columns=["Status Type", "Asset Tag"]) # 若仅需单列资产标签,直接合并列表即可: # df = pd.DataFrame({"Asset Tag": missing_list + bad_status_list})
关键说明
- 原代码中
[missing_list]会创建一个仅包含单个元素的列表(这个元素就是完整的missing_list),Pandas会将其识别为一行数据; - 去掉嵌套后,字典的值直接是资产标签列表,Pandas会自动将列表中的每个元素拆分为单独的行。
内容的提问来源于stack exchange,提问作者manuel bethancourt
相关产品推荐
相关产品推荐

