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

如何将DataFrame每行按指定列表元素重复并添加对应列?

问题描述

现有如下DataFrame:

import pandas as pd
df = pd.DataFrame({'A': ['foo', 'bar', 'dex', 'tru'],
                   'B': ['abc', 'def', 'ghi', 'jkl']})

显示效果:

A    B
0  foo  abc
1  bar  def
2  dex  ghi
3  tru  jkl

同时有一个列表:

block_number = [1000, 2000]

期望生成的new_df如下:

new_df = pd.DataFrame({'A': ['foo', 'bar', 'dex', 'tru', 'foo', 'bar', 'dex', 'tru'],
                       'B': ['abc', 'def', 'ghi', 'jkl', 'abc', 'def', 'ghi', 'jkl'],
                       'block_number': [1000, 1000, 1000, 1000, 2000, 2000, 2000, 2000]})

显示效果:

A    B  block_number
0  foo  abc          1000
1  bar  def          1000
2  dex  ghi          1000
3  tru  jkl          1000
4  foo  abc          2000
5  bar  def          2000
6  dex  ghi          2000
7  tru  jkl          2000

需求为:让原DataFrame的每一行匹配列表中的每个元素,生成最终的DataFrame。

解决方案

方法1:交叉连接(最直观)

将列表转为DataFrame后,与原DataFrame做无关联条件的合并,实现笛卡尔积:

block_df = pd.DataFrame({'block_number': block_number})
new_df = pd.merge(df, block_df, how='cross')

方法2:循环拼接+赋值

遍历列表中的每个元素,为原DataFrame添加对应block_number列后拼接:

new_df = pd.concat([df.assign(block_number=num) for num in block_number], ignore_index=True)

方法3:重复行+广播列

通过重复原DataFrame的行,再为block_number列赋值重复的列表元素:

# 重复原DataFrame的行,次数等于列表长度
new_df = df.loc[df.index.repeat(len(block_number))].reset_index(drop=True)
# 为block_number列赋值,每个列表元素重复原DataFrame行数的次数
new_df['block_number'] = pd.Series(block_number).repeat(len(df)).values

以上三种方法均可实现需求,其中pd.merge(how='cross')代码简洁,可读性最强。

内容的提问来源于stack exchange,提问作者Luiz Scheuer

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 20:21:11