同一列的多个副本进入新数据框

时间:2018-06-22 05:31:44

标签: python python-3.x pandas dataframe

使用pandas-python

我有一个现有的数据框,可以说  Dataframe A (18 rows, 40 columns)

我创建了一个可以命名为Dataframe B (18 rows, 127 columns)的新数据框(这并不完全重要)。

我想遍历Dataframe A的每一列(或不遍历),并将每一列复制到Dataframe B ...除了,我想在{的每一列上复制3遍{1}},每4列从0开始。

  

示例:
  如果前5个A中的col_headersA,我想   关联的[0,1,2,3,4]具有与col_headers相同的值,如下所示:   B

我正在尝试使用内置的potentailly函数来执行这样的过程,以查看是否存在快速循环或不循环的方法。我已经想出了一种方法来进行循环,但是如果可能的话,我试图避免进行繁重的计算。

2 个答案:

答案 0 :(得分:3)

首先按所需顺序创建列标识符列表。然后使用pd.DataFrame.iloc。请注意,iloc与NumPy一样,接受重复的整数以按位置进行索引。

这是一个演示:

from itertools import chain

df = pd.DataFrame([[1, 2, 3, 4, 5], [6, 7, 8, 9, 10]],
                  columns=[0, 1, 2, 3, 4])

L = list(chain.from_iterable([[j]*3 if i%4 else [j] \
         for i, j in enumerate(df.columns)]))

res = df.iloc[:, L]

print(res)

   0  1  1  1  2  2  2  3  3  3   4
0  1  2  2  2  3  3  3  4  4  4   5
1  6  7  7  7  8  8  8  9  9  9  10

答案 1 :(得分:1)

尝试一下

import pandas as pd
import numpy as np
df1=pd.DataFrame(np.random.randint(1,100,size=(18,40)))
df1_cols=df1.columns.values
req_cols= sum([[col]*3 if col%4!=0 else [col] for col in df1_cols],[])
res=pd.concat(df2,df1[req_cols])


# req_cols:

[0, 1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 5, 5, 5, 6, 6, 6, 7, 7, 7, 8, 9, 9, 9, 10, 10, 10, 11, 11, 11, 12, 13, 13, 13, 14, 14, 14, 15, 15, 15, 16, 17, 17, 17, 18, 18, 18, 19, 19, 19, 20, 21, 21, 21, 22, 22, 22, 23, 23, 23, 24, 25, 25, 25, 26, 26, 26, 27, 27, 27, 28, 29, 29, 29, 30, 30, 30, 31, 31, 31, 32, 33, 33, 33, 34, 34, 34, 35, 35, 35, 36, 37, 37, 37, 38, 38, 38, 39, 39, 39]

说明:

您需要首先将一列纳入列表。然后在%4!= 0时为您的问题重复3次。因此req_cols包含您需要的列。然后从df1中切片。最后要复制的内容与df2合并。您将成功获得理想的结果。