如何按规则将多列表数据循环填充至空DataFrame?
问题描述
现有三个数据列表:
dates = [1,2,3] # 周数 stores = [101,102,103] # 门店编号 items = [12344,4544] # 商品编号
还有一个空的DataFrame,列名是date、stores、items,需要按下面的规则填充,最终得到date/stores/item组合完全唯一的结果(实际场景里三个列表可能有几千个元素,必须基于列表长度动态实现,不能写死具体数值):
- 每个周数要重复
len(stores)*len(items)次(示例里就是3*2=6次) - 每个门店编号对应同一个周数时,要重复
len(items)次(示例里是2次) - 商品编号按原始顺序依次和前两者组合
你之前尝试用循环实现但没成功,试的代码是:
a=["A","B","C"] b=[155,155,155] x = [] for i in range(len(a)): x += [a[i]]*b[i] print(x) x = [] for i in range(len(date)): x += [date[i]]*b[i] df['date'] = x
解决方案
方法1:用itertools.product生成笛卡尔积
这是最省心高效的方式——你要的本质就是三个列表的所有唯一组合,正好对应笛卡尔积的结果,不用手动算重复次数,代码简洁还能处理大数据量:
import pandas as pd from itertools import product dates = [1,2,3] stores = [101,102,103] items = [12344,4544] # 生成所有不重复的组合 all_combinations = list(product(dates, stores, items)) # 转成DataFrame df = pd.DataFrame(all_combinations, columns=['date', 'stores', 'items'])
对应规则验证:
- 每个周数对应3*2=6条记录,符合规则1
- 每个门店对应同一个周数有2条记录,符合规则2
- 商品按原始顺序和每个周、门店配对,符合规则3
方法2:手动构造每一列(完全按规则逻辑)
如果不想用itertools,也可以按规则手动构造每一列,所有重复次数都基于列表长度动态计算:
import pandas as pd dates = [1,2,3] stores = [101,102,103] items = [12344,4544] # 先算各列表的长度,用来动态计算重复次数 store_count = len(stores) item_count = len(items) total_per_date = store_count * item_count # 构造date列:每个日期重复total_per_date次 date_column = [d for d in dates for _ in range(total_per_date)] # 构造stores列:每个门店重复item_count次,整个门店列表重复len(dates)次 stores_column = [s for _ in dates for s in stores for _ in range(item_count)] # 构造items列:整个商品列表重复len(dates)*store_count次 items_column = items * (len(dates)*store_count) # 组装成DataFrame df = pd.DataFrame({ 'date': date_column, 'stores': stores_column, 'items': items_column })
为啥你之前的循环没成功?
你之前的代码里用了固定的b=[155,155,155],但实际需要的重复次数应该是动态计算的(比如每个日期要重复len(stores)*len(items)次),而且只处理了date列,没覆盖门店和商品的构造逻辑——上面的方法2就是把你的思路补全,改成了动态计算的版本。
内容的提问来源于stack exchange,提问作者Павел
相关产品推荐
相关产品推荐

