将列数据转置并复制到每一行

Transpose and copy column data to each row

本文关键字:一行 数据 转置 复制      更新时间:2023-09-26

我在下面的结构中设置了数据

  A ,B ,C ,D ,E
1 a1,b1,c1,d1,e1
2 a2,b2,c2,d2,e2
3 a3,b3,c3,d3,e3
4 a4,b4,c4,d4,e4

我想从E列下的每一行中取出x个字段,这样就会产生以下影响

  A ,B ,C ,D ,E
1 a1,b1,c1,d1,e1,e2,e3
2 a2,b2,c2,d2,e2,e3,e4
3 a3,b3,c3,d3,e3,e4,etc
4 a4,b4,c4,d4,e4,etc,etc

我只使用了etc,因为我可以想象我要做的事情会被传递出去。

基本上转置数据只允许我取列的一个区域并将其转换为行,但我不想在转置后删除数据,我只是想复制这些区域,但我有一个大的电子表格(目前1500行,并不断增长)

虽然我使用的是电子表格,这只是一个CSV,如果需要的话,我可以使用各种脚本语言或编程语言,我考虑过c++,python,javascript等,但我不确定什么是实现这一目标的最简单的方法。

这应该基本上做你所要求的。首先是一些虚拟数据:

def char_range(c1, c2):
    """Generates the characters from `c1` to `c2`, inclusive."""
    for c in xrange(ord(c1), ord(c2)+1):
        yield chr(c)
matrix = [[c + str(i) for c in char_range('a', 'e')] for i in range(1, 5)]

我们得到:

[['a1', 'b1', 'c1', 'd1', 'e1'], 
 ['a2', 'b2', 'c2', 'd2', 'e2'],
 ['a3', 'b3', 'c3', 'd3', 'e3'],
 ['a4', 'b4', 'c4', 'd4', 'e4']]

现在有一些变量使表达式更容易阅读:

# How many values you want to grab for each row
x = 3
# Length of the last column in the matrix
last = len(matrix)

现在是魔术。我做了一个假设,如果我们到达最后一行的末尾,我们就放更少的值。这应该只适用于最后的x行。

[mr + [row[-1] for row in matrix[min(i+1, last):min(i+1+grab, last)]]
 for (i, mr) in enumerate(matrix)]

导致:

[['a1', 'a2', 'a3', 'a4', 'b4', 'c4', 'd4'],
 ['b1', 'b2', 'b3', 'b4', 'c4', 'd4', 'e4'],
 ['c1', 'c2', 'c3', 'c4', 'd4', 'e4'],
 ['d1', 'd2', 'd3', 'd4', 'e4'],
 ['e1', 'e2', 'e3', 'e4']]

注意这里min的使用因为我们不想超出矩阵的边界,我们不知道它是否是方阵等等。除此之外,表达式说"构造一个包含原始矩阵第i行的新行,并添加从min(i+1, last)min(i+1+grab, last)的每一行的最后一个元素"