如何根据 header 标题对 CSV 数据进行排序,从行到列
How can I sort my CSV data from going into from rows into columns based on the header titles
在使用 Python 和 CSV 模块一段时间后,我终于能够在转置原始输出后提取一些具有特定值的数据,我们计划在未来的报告中使用该代码。问题是,代码需要按列而不是行来读取报告。
本质上,数据是这样的:1/Location/Ratio/Delay/Grade
,然后是3/Location/Ratio/Delay/Grade
,以此类推,直到数据结束。
在他们每个人的下面,是与他们相关的具体数据。基本上,输出是在一个巨大的行池中读取的,我基本上想像这样读取数据:
1/Location/Ratio/Delay/Grade
(Data)
但对于所有数据。我基本上是在看一个代码片段,而不是一长排,它允许我根据每个点给出的数字按列分隔行。 (例如,1、3、8、22 等...)这会让我大吵大闹。无需转置,因为我已经做到了这一点。
提前谢谢大家!如果我必须 post 我的代码,我愿意这样做。
我希望它从这里开始......
...到这个
也许这会给你一些想法,下面的脚本接受一个输入 CSV 文件,并通过计算有多少列包含单词 Movement
来确定有多少水平块。
然后在每个 Movement
列拆分每组列并将输出写入新的 output.csv
文件。
from itertools import product
with open('input.csv', 'rb') as f_input, open('output.csv', 'wb') as f_output:
csv_input = csv.reader(f_input)
csv_output = csv.writer(f_output)
rows = list(csv_input) # Load all rows in
block_count = len([x for x in rows[0] if x.find('Movement') != -1])
row_count = len(rows)
col_count = len(rows[0]) / block_count
for block, row in product(range(block_count), range(row_count)):
csv_output.writerow(rows[row][block * col_count : block * col_count + col_count])
所以输入文件如下:
1 Movement,c2,c3,c4,c5,c6,c7,2 Movement,c2,c3,c4,c5,c6,c7,3 Movement,c2,c3,c4,c5,c6,c7
1,2,3,4,5,6,7,1,2,3,4,5,6,7,1,2,3,4,5,6,7
1,2,3,4,5,6,7,1,2,3,4,5,6,7,1,2,3,4,5,6,7
1,2,3,4,5,6,7,1,2,3,4,5,6,7,1,2,3,4,5,6,7
1,2,3,4,5,6,7,1,2,3,4,5,6,7,1,2,3,4,5,6,7
1,2,3,4,5,6,7,1,2,3,4,5,6,7,1,2,3,4,5,6,7
将产生以下输出文件:
1 Movement,c2,c3,c4,c5,c6,c7
1,2,3,4,5,6,7
1,2,3,4,5,6,7
1,2,3,4,5,6,7
1,2,3,4,5,6,7
1,2,3,4,5,6,7
2 Movement,c2,c3,c4,c5,c6,c7
1,2,3,4,5,6,7
1,2,3,4,5,6,7
1,2,3,4,5,6,7
1,2,3,4,5,6,7
1,2,3,4,5,6,7
3 Movement,c2,c3,c4,c5,c6,c7
1,2,3,4,5,6,7
1,2,3,4,5,6,7
1,2,3,4,5,6,7
1,2,3,4,5,6,7
1,2,3,4,5,6,7
使用 Python 2.7.9
测试
在使用 Python 和 CSV 模块一段时间后,我终于能够在转置原始输出后提取一些具有特定值的数据,我们计划在未来的报告中使用该代码。问题是,代码需要按列而不是行来读取报告。
本质上,数据是这样的:1/Location/Ratio/Delay/Grade
,然后是3/Location/Ratio/Delay/Grade
,以此类推,直到数据结束。
在他们每个人的下面,是与他们相关的具体数据。基本上,输出是在一个巨大的行池中读取的,我基本上想像这样读取数据:
1/Location/Ratio/Delay/Grade
(Data)
但对于所有数据。我基本上是在看一个代码片段,而不是一长排,它允许我根据每个点给出的数字按列分隔行。 (例如,1、3、8、22 等...)这会让我大吵大闹。无需转置,因为我已经做到了这一点。
提前谢谢大家!如果我必须 post 我的代码,我愿意这样做。
我希望它从这里开始......
...到这个
也许这会给你一些想法,下面的脚本接受一个输入 CSV 文件,并通过计算有多少列包含单词 Movement
来确定有多少水平块。
然后在每个 Movement
列拆分每组列并将输出写入新的 output.csv
文件。
from itertools import product
with open('input.csv', 'rb') as f_input, open('output.csv', 'wb') as f_output:
csv_input = csv.reader(f_input)
csv_output = csv.writer(f_output)
rows = list(csv_input) # Load all rows in
block_count = len([x for x in rows[0] if x.find('Movement') != -1])
row_count = len(rows)
col_count = len(rows[0]) / block_count
for block, row in product(range(block_count), range(row_count)):
csv_output.writerow(rows[row][block * col_count : block * col_count + col_count])
所以输入文件如下:
1 Movement,c2,c3,c4,c5,c6,c7,2 Movement,c2,c3,c4,c5,c6,c7,3 Movement,c2,c3,c4,c5,c6,c7
1,2,3,4,5,6,7,1,2,3,4,5,6,7,1,2,3,4,5,6,7
1,2,3,4,5,6,7,1,2,3,4,5,6,7,1,2,3,4,5,6,7
1,2,3,4,5,6,7,1,2,3,4,5,6,7,1,2,3,4,5,6,7
1,2,3,4,5,6,7,1,2,3,4,5,6,7,1,2,3,4,5,6,7
1,2,3,4,5,6,7,1,2,3,4,5,6,7,1,2,3,4,5,6,7
将产生以下输出文件:
1 Movement,c2,c3,c4,c5,c6,c7
1,2,3,4,5,6,7
1,2,3,4,5,6,7
1,2,3,4,5,6,7
1,2,3,4,5,6,7
1,2,3,4,5,6,7
2 Movement,c2,c3,c4,c5,c6,c7
1,2,3,4,5,6,7
1,2,3,4,5,6,7
1,2,3,4,5,6,7
1,2,3,4,5,6,7
1,2,3,4,5,6,7
3 Movement,c2,c3,c4,c5,c6,c7
1,2,3,4,5,6,7
1,2,3,4,5,6,7
1,2,3,4,5,6,7
1,2,3,4,5,6,7
1,2,3,4,5,6,7
使用 Python 2.7.9
测试