在保持 ID 的同时转置 csv
Transpose csv While Maintaining ID
我有一个相当大的逗号分隔 csv 文件,其结构类似于:
ZipCd Var1 Var2 Var 3
12345 12 45 10
67890 13 23 5
. . . .
. . . .
. . . .
30010 99 17 6
对于每个 ZipCd,右侧都有许多变量(总共大约 250 个变量)。我希望产生以下输出:
ZipCd Var Value
12345 1 12
12345 2 45
12345 3 10
67890 1 13
67890 2 23
67890 3 5
30010 1 99
30010 2 17
30010 3 6
我尝试了以下操作:
with open("file.csv") as f, open("out.csv","w") as out:
headers = next(f).split()[0:] #Get first row of original csv for headers and variable names
for row in f:
row = row.split(",") #split row into values delimited by comma
ZipCd = row[0]
Var1 = row[1]
Var2 = row[2]
Var3 = row[3]
data = zip(headers, row[1:])
for a, b in data:
out.write("{} {} {}\n".format(ZipCd,a,b))
这会产生:
12345 ZipCd,Var1,Var2,Var3 12
67890 ZipCd,Var1,Var2,Var3 13
我们将不胜感激在生成所需输出方面的任何帮助。
输入文件分隔符似乎有误。显然是 逗号,但您在不使用任何参数的情况下拆分标题:标题未拆分,并且包含所有字段,以逗号分隔。
我提出一个解决方案
- 使用
csv
模块读取输入文件,更干净。
- 接受尽可能多的变量
- 像对待 "transpose" 数据一样使用
zip
- 巧妙的技巧
for zipcd,*vars in cr
用于将 zipcd
作为第一个字段,将 vars
作为其余字段(称为 Extended Iterable Unpacking 也就是 Martineau 今天在另一个答案中解释的“*目标特征”)
代码:
import csv
with open("file.csv") as f, open("out.csv","w") as out:
cr = csv.reader(f) # default separator is comma
variable_names = next(cr)[1:] # ignore first field in the title line
out.write("ZipCd Var Value\n")
for zipcd,*vars in cr:
for vn,vv in zip(variable_names,vars): # interleave data
out.write("{} {} {}\n".format(zipcd,vn,vv))
示例输入:
ZipCd,Var1,Var2,Var3
12345,12,45,10
67890,13,23,5
30010,99,17,6
结果输出:
ZipCd Var Value
12345 Var1 12
12345 Var2 45
12345 Var3 10
67890 Var1 13
67890 Var2 23
67890 Var3 5
30010 Var1 99
30010 Var2 17
30010 Var3 6
我有一个相当大的逗号分隔 csv 文件,其结构类似于:
ZipCd Var1 Var2 Var 3
12345 12 45 10
67890 13 23 5
. . . .
. . . .
. . . .
30010 99 17 6
对于每个 ZipCd,右侧都有许多变量(总共大约 250 个变量)。我希望产生以下输出:
ZipCd Var Value
12345 1 12
12345 2 45
12345 3 10
67890 1 13
67890 2 23
67890 3 5
30010 1 99
30010 2 17
30010 3 6
我尝试了以下操作:
with open("file.csv") as f, open("out.csv","w") as out:
headers = next(f).split()[0:] #Get first row of original csv for headers and variable names
for row in f:
row = row.split(",") #split row into values delimited by comma
ZipCd = row[0]
Var1 = row[1]
Var2 = row[2]
Var3 = row[3]
data = zip(headers, row[1:])
for a, b in data:
out.write("{} {} {}\n".format(ZipCd,a,b))
这会产生:
12345 ZipCd,Var1,Var2,Var3 12
67890 ZipCd,Var1,Var2,Var3 13
我们将不胜感激在生成所需输出方面的任何帮助。
输入文件分隔符似乎有误。显然是 逗号,但您在不使用任何参数的情况下拆分标题:标题未拆分,并且包含所有字段,以逗号分隔。
我提出一个解决方案
- 使用
csv
模块读取输入文件,更干净。 - 接受尽可能多的变量
- 像对待 "transpose" 数据一样使用
zip
- 巧妙的技巧
for zipcd,*vars in cr
用于将zipcd
作为第一个字段,将vars
作为其余字段(称为 Extended Iterable Unpacking 也就是 Martineau 今天在另一个答案中解释的“*目标特征”)
代码:
import csv
with open("file.csv") as f, open("out.csv","w") as out:
cr = csv.reader(f) # default separator is comma
variable_names = next(cr)[1:] # ignore first field in the title line
out.write("ZipCd Var Value\n")
for zipcd,*vars in cr:
for vn,vv in zip(variable_names,vars): # interleave data
out.write("{} {} {}\n".format(zipcd,vn,vv))
示例输入:
ZipCd,Var1,Var2,Var3
12345,12,45,10
67890,13,23,5
30010,99,17,6
结果输出:
ZipCd Var Value
12345 Var1 12
12345 Var2 45
12345 Var3 10
67890 Var1 13
67890 Var2 23
67890 Var3 5
30010 Var1 99
30010 Var2 17
30010 Var3 6