如何生成行数等于各列长度乘积的DataFrame?
生成多列笛卡尔积DataFrame的高效方法
你需要的是基于各列取值生成笛卡尔积的DataFrame,pandas提供了多种快速实现方式,完全支持多列场景:
方法1:用pd.MultiIndex.from_product(推荐,简洁高效)
直接通过多索引的笛卡尔积生成DataFrame,代码量少,适合提前定义好所有列数据的场景:
import pandas as pd # 定义各列的取值(可扩展任意多列) col_data = { "color": [1, 2, 3], "weekday": [0, 1] } # 生成笛卡尔积DataFrame df = pd.DataFrame( pd.MultiIndex.from_product(col_data.values(), names=col_data.keys()), columns=col_data.keys() )
运行后输出就是你要的结果,新增列只需在col_data字典中添加键值对即可——比如加"size": ["S", "M", "L"],会自动生成3×2×3=18行的DataFrame。
方法2:用pd.merge的交叉连接(直观易读)
pandas 1.2.0及以上版本支持how="cross"参数,可直接对多个单列DataFrame做交叉合并:
import pandas as pd # 每个列单独生成DataFrame df_color = pd.DataFrame({"color": [1, 2, 3]}) df_weekday = pd.DataFrame({"weekday": [0, 1]}) # 交叉合并生成笛卡尔积 df = df_color.merge(df_weekday, how="cross")
多列场景下,只需依次链式调用merge即可——比如再合并df_size = pd.DataFrame({"size": ["S", "M", "L"]}),只需写df_color.merge(df_weekday, how="cross").merge(df_size, how="cross")。
方法3:用itertools.product(原生Python结合)
借助Python标准库的itertools.product生成笛卡尔积元组,再转为DataFrame,适合需要先处理元组的场景:
import pandas as pd from itertools import product # 定义各列取值 color_list = [1, 2, 3] weekday_list = [0, 1] # 生成笛卡尔积并转DataFrame df = pd.DataFrame(product(color_list, weekday_list), columns=["color", "weekday"])
多列时,在product参数中添加更多序列即可,比如product(color_list, weekday_list, size_list)。
内容的提问来源于stack exchange,提问作者Kathie
相关产品推荐
相关产品推荐

