如何基于多列名列表高效构建Pandas DataFrame?
最优实现:生成多列表的笛卡尔积DataFrame
嘿,这个需求本质上就是要生成几个列表的笛卡尔积(也就是所有可能的元素组合)对吧?这在构造全量维度表、测试数据集的时候特别常用,用pandas的原生方法就能高效搞定,完全不用写繁琐的循环~
下面给你两种简洁高效的实现方式:
方法1:用pandas的MultiIndex.from_product(推荐)
这种方法是pandas原生的,代码简洁且可读性强,适合直接生成带列名的DataFrame:
import pandas as pd import calendar # 先获取你的各个列表(假设dfx是已有数据集) l1 = dfx.v1.unique() l2 = dfx.v2.unique() day_parts = [1,2,3,4] week_days = list(calendar.day_name) # 生成所有组合并转为DataFrame df = pd.DataFrame( index=pd.MultiIndex.from_product( [l1, l2, day_parts, week_days], names=['v1_col', 'v2_col', 'day_part', 'week_day'] # 这里可以改成你需要的列名 ) ).reset_index()
说明:
pd.MultiIndex.from_product会自动生成所有输入列表的全组合,相当于把每个列表的元素做“全排列”组合names参数直接指定最终DataFrame的列名,后续reset_index()会把索引层级转成普通列,一步到位得到你要的结构
方法2:用itertools.product(更灵活)
如果你习惯用Python标准库的工具,itertools.product也能轻松实现,适合需要先处理组合再转DataFrame的场景:
import pandas as pd import calendar import itertools # 同样先获取各个列表 l1 = dfx.v1.unique() l2 = dfx.v2.unique() day_parts = [1,2,3,4] week_days = list(calendar.day_name) # 生成所有组合的元组集合 all_combinations = itertools.product(l1, l2, day_parts, week_days) # 转成DataFrame并指定列名 df = pd.DataFrame(all_combinations, columns=['v1_col', 'v2_col', 'day_part', 'week_day'])
说明:
itertools.product会返回一个迭代器,生成所有可能的元素组合元组- 直接把迭代器传给
pd.DataFrame,再通过columns参数指定列名即可
这两种方法都比手动循环逐个append高效得多,尤其是当你的列表元素数量较多时,性能优势会很明显。如果需要调整列名或者组合顺序,只要修改输入列表的顺序和列名参数就行~
内容的提问来源于stack exchange,提问作者mkmostafa
相关产品推荐
相关产品推荐

