如何使用Pandas将DataFrame每行复制n次并分配对应类别?
Pandas实现DataFrame每行复制并分配类别的最简方法
问题说明
给定初始DataFrame和类别列表:
import pandas as pd df = pd.DataFrame({'col1': [1,1,2,3], 'col2': [2,4,3,5]}) group_l = ['a', 'b']
初始数据样式:
col1 col2 0 1 2 1 1 4 2 2 3 3 3 5
需要转换为每行复制对应类别次数、新增group列的目标DataFrame:
col1 col2 group 0 1 2 a 1 1 4 a 2 2 3 a 3 3 5 a 0 1 2 b 1 1 4 b 2 2 3 b 3 3 5 b
最简实现方法
方法1:用merge生成笛卡尔积(推荐)
Pandas 1.2.0及以上版本支持how='cross'参数,直接生成原DataFrame和类别列表的笛卡尔积,代码简洁且性能优异:
group_df = pd.DataFrame({'group': group_l}) result = df.merge(group_df, how='cross')
这种方式不需要额外的循环或复杂索引操作,底层实现高效,数据量大时优势明显。
方法2:concat结合assign(兼容旧版本)
如果你的Pandas版本较低,不支持cross合并,可以用列表推导式给每个类别生成带group列的DataFrame,再拼接:
result = pd.concat([df.assign(group=g) for g in group_l], ignore_index=False)
设置ignore_index=False会保留原DataFrame的索引,和目标格式完全匹配;如果不需要原索引,改成True即可。
关于你提到的方案对比
- 你说
pd.MultiIndex.from_product只适用于单列其实不准确,只是实现起来更繁琐:
但步骤比上面两种方法多,可读性也差一些。idx = pd.MultiIndex.from_product([df.index, group_l], names=[None, 'group']) result = df.reindex(idx.get_level_values(0)).assign(group=idx.get_level_values(1)) explode方法确实效率偏低,因为要先给每行添加列表再展开,数据量越大,内存和时间消耗越明显,不推荐。
内容的提问来源于stack exchange,提问作者extremeaxe5
相关产品推荐
相关产品推荐

