首页 > 解决方案 > 复制熊猫数据框中的行和列

问题描述

我想在具有 36 列和 28 行的 pandas DataFrame 中多次(30 次)扩展和复制行和列。因此结果应该是一个 1.080 x 840 的矩阵。

例子:

    ARG     BRA     BRN
AUS 2.93    3.06    3.56
AUT 5.36    5.47    2.14
BEL 5.36    5.47    2.14

结果应该是:

    ARG    ARG   BRA   BRA    BRN   BRN
AUS 2.93   2.93  3.06  3.06   3.56  3.56
AUS 2.93   2.93  3.06  3.06   3.56  3.56
AUT 5.36   5.36  5.47  5.47   2.14  2.14
AUT 5.36   5.36  5.47  5.47   2.14  2.14
BEL 5.36   5.36  5.47  5.47   2.14  2.14   
BEL 5.36   5.36  5.47  5.47   2.14  2.14

有没有一种简单的方法可以做到这一点?先感谢您!

标签: pythonpandasreplicate

解决方案


可以通过Index.repeatDataFrame.loc

N = 2
df = df.loc[df.index.repeat(N), df.columns.repeat(N)]
print (df)
     ARG   ARG   BRA   BRA   BRN   BRN
AUS  2.93  2.93  3.06  3.06  3.56  3.56
AUS  2.93  2.93  3.06  3.06  3.56  3.56
AUT  5.36  5.36  5.47  5.47  2.14  2.14
AUT  5.36  5.36  5.47  5.47  2.14  2.14
BEL  5.36  5.36  5.47  5.47  2.14  2.14
BEL  5.36  5.36  5.47  5.47  2.14  2.14

但是然后得到重复的列名,所以通过名称查找是有问题的:

print (df['ARG'])
      ARG   ARG
AUS  2.93  2.93
AUS  2.93  2.93
AUT  5.36  5.36
AUT  5.36  5.36
BEL  5.36  5.36

为防止可能重复列名:

df.columns = [f'{a}_{b+1}' for a, b in zip(df.columns, np.arange(df.shape[1]) % N)]
print (df)
     ARG_1  ARG_2  BRA_1  BRA_2  BRN_1  BRN_2
AUS   2.93   2.93   3.06   3.06   3.56   3.56
AUS   2.93   2.93   3.06   3.06   3.56   3.56
AUT   5.36   5.36   5.47   5.47   2.14   2.14
AUT   5.36   5.36   5.47   5.47   2.14   2.14
BEL   5.36   5.36   5.47   5.47   2.14   2.14
BEL   5.36   5.36   5.47   5.47   2.14   2.14

推荐阅读