如何高效合并Pandas DataFrame与含列表列的DataFrame
高效合并含列表分类列的Pandas DataFrame
当然可行!而且完全不用写繁琐的循环,用Pandas的内置矢量化操作就能轻松搞定,特别适合大规模数据集的场景。我给你一步步拆解怎么做:
先看示例场景
假设我们有两个DataFrame:
- 一个存储产品基础信息(比如ID、名称、价格)
- 另一个存储产品的分类,其中
categories列的每个值都是一个分类列表
先构造示例数据方便理解:
import pandas as pd # 产品信息DataFrame df_products = pd.DataFrame({ 'product_id': [1, 2, 3], 'product_name': ['Laptop', 'Phone', 'Tablet'], 'price': [999, 699, 299] }) # 分类信息DataFrame,分类列为列表格式 df_categories = pd.DataFrame({ 'product_id': [1, 2, 3], 'categories': [['Electronics', 'Computers'], ['Electronics', 'Mobile', 'Accessories'], ['Electronics', 'Tablets']] })
高效合并步骤
核心思路是先把分类列的列表拆分成单独行,再和产品信息合并,全程都是Pandas的内置高效操作:
- 拆分列表列:用
explode()方法把每个分类列表里的元素拆成独立行,这样每个产品-分类组合都变成一条记录 - 合并DataFrame:用
merge()按产品ID关联两个DataFrame
代码实现如下:
# 第一步:拆分分类列表为多行 df_categories_exploded = df_categories.explode('categories') # 第二步:合并产品信息和拆分后的分类数据 df_final = pd.merge(df_products, df_categories_exploded, on='product_id', how='left')
运行后得到的df_final就是你要的目标DataFrame,每个产品的每个分类都对应一行,而且完全没有循环,效率拉满!
为什么这方法高效?
explode()和merge()都是Pandas底层用C实现的矢量化操作,比Python层面的循环快几个数量级——哪怕你的数据集有几十万甚至上百万条记录,也能快速处理。
如果你的需求里需要保留原分类列表,或者要处理缺失分类的情况,只需要调整merge()的how参数(比如how='inner'只保留有分类的产品)就行,灵活性很强。
内容的提问来源于stack exchange,提问作者Nicolai Iversen
相关产品推荐
相关产品推荐

