如何无循环实现两个列表的笛卡尔积转为DataFrame?
无需for循环生成笛卡尔积DataFrame的方案
当然没问题!完全不需要写for循环就能轻松生成你想要的DataFrame,这里给你两种简洁高效的实现方式:
方案1:借助itertools.product生成笛卡尔积
itertools.product是Python标准库中专门用来生成多个可迭代对象笛卡尔积的工具,用它配合Pandas可以一行搞定:
import pandas as pd from itertools import product names_list = ['A', 'B', 'C', 'D', 'E'] num_list = list(range(1,21)) # 直接生成两个列表的笛卡尔积,再转为指定列名的DataFrame df = pd.DataFrame(product(names_list, num_list), columns=['Name', 'Number'])
说明:product(names_list, num_list)会按你需要的顺序(先遍历所有名称,每个名称对应所有数字)生成所有组合,完全不需要手动循环,而且是惰性迭代器,内存效率很高。
方案2:纯Pandas内置方法实现(无需额外导入库)
如果你更倾向于只用Pandas的话,可以用merge的cross连接类型,这是Pandas 1.2.0及以上版本支持的特性,专门用来生成笛卡尔积:
import pandas as pd names_list = ['A', 'B', 'C', 'D', 'E'] num_list = list(range(1,21)) # 先把两个列表转为单独的DataFrame df_names = pd.DataFrame({'Name': names_list}) df_nums = pd.DataFrame({'Number': num_list}) # 执行交叉连接生成笛卡尔积 df = df_names.merge(df_nums, how='cross')
说明:how='cross'会让两个DataFrame的所有行进行组合,正好符合你的需求,全程没有手动循环,代码也更贴合Pandas的使用习惯。
两种方法都能完美生成你想要的结果,而且效率远高于手动写for循环,尤其是当列表规模较大时优势更明显。
内容的提问来源于stack exchange,提问作者ForgachM
相关产品推荐
相关产品推荐

