Python 如何在DataFrame中复制N次列?

Python 如何在DataFrame中复制N次列?,python,pandas,dataframe,Python,Pandas,Dataframe,我有一个只有一列的数据框,我想得到一个有N列的数据框,所有这些都与第一列相同。我可以简单地通过以下方式复制它: df[['new column name']] = df[['column name']] 但我必须制作1000多个相同的栏目,这就是为什么它不起作用的原因 . 一件重要的事情是,列中的数字应该更改,例如,如果第一列为0,第n列为n,前一列为n-1,则表示您有一个df:,列名为“company\u name”,由8家公司组成: df = {"company_name&quo

我有一个只有一列的数据框,我想得到一个有N列的数据框,所有这些都与第一列相同。我可以简单地通过以下方式复制它:

df[['new column name']] = df[['column name']]
但我必须制作1000多个相同的栏目,这就是为什么它不起作用的原因
. 一件重要的事情是,列中的数字应该更改,例如,如果第一列为0,第n列为n,前一列为n-1,则表示您有一个
df:
,列名为“company\u name”,由8家公司组成:

df = {"company_name":{"0":"Telia","1":"Proximus","2":"Tmobile","3":"Orange","4":"Telefonica","5":"Verizon","6":"AT&T","7":"Koninklijke"}}

  company_name
0        Telia
1     Proximus
2      Tmobile
3       Orange
4   Telefonica
5      Verizon
6         AT&T
7  Koninklijke
您可以使用
循环
范围
来确定要创建多少相同的列,并执行以下操作:

for i in range(0,1000):
    df['company_name'+str(i)] = df['company_name']
这将导致
df的
形状

df.shape
(8, 1001)
i、 它将相同的列复制了1000次。重复的
列的名称将与原始列的名称相同,并在末尾加上一个整数(=+1):

'company_name', 'company_name0', 'company_name1', 'company_name2','company_name..N'
使用
df将列“C”复制5次。分配

n = 5
df2 = df.assign(**{f'C{i}': df['C'] for i in range(1, n+1)})
df2

   A  B  C C1 C2 C3 C4 C5
0  x  x  x  x  x  x  x  x
1  y  x  z  z  z  z  z  z
n
设置为1000以获得所需的输出


您还可以直接将结果分配回:

df[[f'C{i}' for i in range(1, n+1)]] = df[['C']*n].to_numpy()
df
 
   A  B  C C1 C2 C3 C4 C5
0  x  x  x  x  x  x  x  x
1  y  x  z  z  z  z  z  z

如果是单列,您可以使用Transpose,然后使用
pd.concat
简单地复制它们,并将其转换回原始格式,这样可以避免循环,而且应该更快,然后您可以在第二行中更改列名,但如果不处理数据帧中的所有数据,这将是最消耗性能的:

import pandas as pd
df = pd.DataFrame({'Column':[1,2,3,4,5]})
原始数据帧:

   Column
0       1
1       2
2       3
3       4
4       5
df = pd.concat([df.T]*1000).T
输出:

   Column  Column  Column  Column  ...  Column  Column  Column  Column
0       1       1       1       1  ...       1       1       1       1
1       2       2       2       2  ...       2       2       2       2
2       3       3       3       3  ...       3       3       3       3
3       4       4       4       4  ...       4       4       4       4
4       5       5       5       5  ...       5       5       5       5

[5 rows x 1000 columns]

df.columns = ['Column'+'_'+str(i) for i in range(1000)]

我认为最有效的方法是使用索引,而不是使用外部循环

n = 3
new_df = df.loc[:, ['column_duplicate']*n + 
                   df.columns.difference(['column_duplicate']).tolist()]
print(new_df)

   column_duplicate  column_duplicate  column_duplicate  other
0                 0                 0                 0     10
1                 1                 1                 1     11
2                 2                 2                 2     12
3                 3                 3                 3     13
4                 4                 4                 4     14
5                 5                 5                 5     15
6                 6                 6                 6     16
7                 7                 7                 7     17
8                 8                 8                 8     18
9                 9                 9                 9     19
如果要添加后缀

suffix_tup = ('a', 'b', 'c')

not_dup_cols = df.columns.difference(['column_duplicate']).tolist()

new_df = (df.loc[:, ['column_duplicate']*len(suffix_tup) + 
                    not_dup_cols]
            .set_axis(list(map(lambda suffix: f'column_duplicate_{suffix}', 
                               suffix_tup)) + 
                      not_dup_cols, axis=1)
         )
print(new_df)


   column_duplicate_a  column_duplicate_b  column_duplicate_c  other
0                   0                   0                   0     10
1                   1                   1                   1     11
2                   2                   2                   2     12
3                   3                   3                   3     13
4                   4                   4                   4     14
5                   5                   5                   5     15
6                   6                   6                   6     16
7                   7                   7                   7     17
8                   8                   8                   8     18
n = 3
not_dup_cols = df.columns.difference(['column_duplicate']).tolist()

new_df = (df.loc[:, ['column_duplicate']*n + 
                    not_dup_cols]
            .set_axis(list(map(lambda x: f'column_duplicate_{x}', range(n))) + 
                      not_dup_cols, axis=1)
         )
print(new_df)

   column_duplicate_0  column_duplicate_1  column_duplicate_2  other
0                   0                   0                   0     10
1                   1                   1                   1     11
2                   2                   2                   2     12
3                   3                   3                   3     13
4                   4                   4                   4     14
5                   5                   5                   5     15
6                   6                   6                   6     16
7                   7                   7                   7     17
8                   8                   8                   8     18
9                   9                   9                   9     19

或添加索引

suffix_tup = ('a', 'b', 'c')

not_dup_cols = df.columns.difference(['column_duplicate']).tolist()

new_df = (df.loc[:, ['column_duplicate']*len(suffix_tup) + 
                    not_dup_cols]
            .set_axis(list(map(lambda suffix: f'column_duplicate_{suffix}', 
                               suffix_tup)) + 
                      not_dup_cols, axis=1)
         )
print(new_df)


   column_duplicate_a  column_duplicate_b  column_duplicate_c  other
0                   0                   0                   0     10
1                   1                   1                   1     11
2                   2                   2                   2     12
3                   3                   3                   3     13
4                   4                   4                   4     14
5                   5                   5                   5     15
6                   6                   6                   6     16
7                   7                   7                   7     17
8                   8                   8                   8     18
n = 3
not_dup_cols = df.columns.difference(['column_duplicate']).tolist()

new_df = (df.loc[:, ['column_duplicate']*n + 
                    not_dup_cols]
            .set_axis(list(map(lambda x: f'column_duplicate_{x}', range(n))) + 
                      not_dup_cols, axis=1)
         )
print(new_df)

   column_duplicate_0  column_duplicate_1  column_duplicate_2  other
0                   0                   0                   0     10
1                   1                   1                   1     11
2                   2                   2                   2     12
3                   3                   3                   3     13
4                   4                   4                   4     14
5                   5                   5                   5     15
6                   6                   6                   6     16
7                   7                   7                   7     17
8                   8                   8                   8     18
9                   9                   9                   9     19

使用循环。。。。。