如何实现DataFrame的元素行列重复扩展(将3×3格式转换为3n×3n格式)
实现矩阵元素行列双向重复的方案
针对你提出的需求,我们可以通过两种简洁的方式实现:一种是利用numpy的向量化操作(推荐,效率更高),另一种是使用pandas的原生方法。下面结合n=2的例子详细说明:
方法一:使用numpy快速实现(推荐)
numpy的repeat函数可以指定轴方向重复元素,完美匹配我们的需求:先在列方向把每个元素重复n次,再在行方向把每一行重复n次。
import numpy as np import pandas as pd # 初始化原始DataFrame X = pd.DataFrame([[0,1,2], [1,0,3], [2,3,0]]) n = 2 # 第一步:沿列轴(axis=1)重复每个元素n次,得到3×(3n)的矩阵 col_expanded = np.repeat(X.values, n, axis=1) # 第二步:沿行轴(axis=0)重复每一行n次,得到(3n)×(3n)的最终矩阵 final_matrix = np.repeat(col_expanded, n, axis=0) # 转换回DataFrame格式 result_df = pd.DataFrame(final_matrix) print(result_df)
代码解释:
X.values:提取DataFrame底层的numpy数组,方便进行向量化操作;np.repeat(..., axis=1):对每个元素在**横向(列方向)**重复n次,比如原行[0,1,2]会变成[0,0,1,1,2,2];np.repeat(..., axis=0):对每一行在**纵向(行方向)**重复n次,比如上面的行会连续出现两次;- 最终转换回DataFrame后,就是你期望的6×6矩阵。
方法二:使用pandas原生方法实现
如果你更倾向于纯pandas操作,可以通过apply和索引重复来实现:
import pandas as pd import numpy as np X = pd.DataFrame([[0,1,2], [1,0,3], [2,3,0]]) n = 2 # 第一步:对每行的元素在列方向重复n次,生成3×6的DataFrame col_expanded = X.apply(lambda row: np.repeat(row, n), axis=1).apply(pd.Series) # 第二步:重复每行n次,生成6×6的最终DataFrame result_df = col_expanded.loc[col_expanded.index.repeat(n)].reset_index(drop=True) print(result_df)
代码解释:
X.apply(lambda row: np.repeat(row, n), axis=1):遍历每行,将行内每个元素重复n次,得到包含numpy数组的Series;.apply(pd.Series):将数组转换为多列,得到3×6的DataFrame;col_expanded.index.repeat(n):将原索引(0、1、2)各自重复n次,通过loc索引后实现行的重复;reset_index(drop=True):重置索引,得到干净的结果。
两种方法都能得到你期望的结果,其中numpy的方法在处理大规模矩阵时效率会更高哦~
内容的提问来源于stack exchange,提问作者xc-2021
相关产品推荐
相关产品推荐

