You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 23:05:22