我有一个包含以下内容的csv文件:
ID Flow TestNa 4 5 6
item_1 A test_1 89 51 67
item_1 A test_2 60 67 44
item_1 A test_3 111 82 67
item_1 B test_1 88 78 75
item_1 B test_2 104 66 66
item_1 B test_3 109 87 49
item_2 A test_1 76 76 88
item_2 A test_2 59 44 60
item_2 A test_3 91 72 59
item_2 B test_1 73 50 80
item_2 B test_2 107 75 67
item_2 B test_3 119 100 50
标题为:ID Flow TestNa 4 5 6
我希望按最后三列进行堆叠,这些列是具有以下结果的数据列:
ID Flow TestNa Label Data
item_1 A test_1 4 89
item_1 A test_1 5 51
item_1 A test_1 6 67
item_1 A test_2 4 60
item_1 A test_2 5 67
item_1 A test_2 6 44
item_1 A test_3 4 111
item_1 A test_3 5 82
item_1 A test_3 6 67
item_1 B test_1 4 88
item_1 B test_1 5 78
item_1 B test_1 6 75
item_1 B test_2 4 104
item_1 B test_2 5 66
item_1 B test_2 6 66
item_1 B test_3 4 109
item_1 B test_3 5 87
item_1 B test_3 6 49
item_2 A test_1 4 76
item_2 A test_1 5 76
item_2 A test_1 6 88
item_2 A test_2 4 59
item_2 A test_2 5 44
item_2 A test_2 6 60
item_2 A test_3 4 91
item_2 A test_3 5 72
item_2 A test_3 6 59
item_2 B test_1 4 73
item_2 B test_1 5 50
item_2 B test_1 6 80
item_2 B test_2 4 107
item_2 B test_2 5 75
item_2 B test_2 6 67
item_2 B test_3 4 119
item_2 B test_3 5 100
item_2 B test_3 6 50
有什么想法吗?
答案 0 :(得分:0)
稍微强力的选择是:
with open('data-out.csv', 'w') as fo:
with open('data.csv', 'r') as fi:
header = fi.readline()
cols = [s.strip() for s in header.split(',')[-3:]]
print >>fo, 'ID,Flow,TestNa,Label,Data'
for line in fi.readlines():
fields = line.strip().split(',')
out_fields = fields[:-3]
for i in range(3):
print >>fo, ','.join(out_fields + [cols[i], fields[-3+i]])
(当然,如果您缺少数据等,这将是非常宽容的。)
输入data.csv
:
ID,Flow,TestNa,4,5,6
item_1,A,test_1,89,51,67
item_1,A,test_2,60,67,44
item_1,A,test_3,111,82,67
item_1,B,test_1,88,78,75
item_1,B,test_2,104,66,66
item_1,B,test_3,109,87,49
item_2,A,test_1,76,76,88
item_2,A,test_2,59,44,60
item_2,A,test_3,91,72,59
item_2,B,test_1,73,50,80
item_2,B,test_2,107,75,67
item_2,B,test_3,119,100,50
输出data-out.csv
:
ID,Flow,TestNa,Label,Data
item_1,A,test_1,4,89
item_1,A,test_1,5,51
item_1,A,test_1,6,67
item_1,A,test_2,4,60
item_1,A,test_2,5,67
item_1,A,test_2,6,44
item_1,A,test_3,4,111
item_1,A,test_3,5,82
item_1,A,test_3,6,67
item_1,B,test_1,4,88
item_1,B,test_1,5,78
item_1,B,test_1,6,75
item_1,B,test_2,4,104
item_1,B,test_2,5,66
item_1,B,test_2,6,66
item_1,B,test_3,4,109
item_1,B,test_3,5,87
item_1,B,test_3,6,49
item_2,A,test_1,4,76
item_2,A,test_1,5,76
item_2,A,test_1,6,88
item_2,A,test_2,4,59
item_2,A,test_2,5,44
item_2,A,test_2,6,60
item_2,A,test_3,4,91
item_2,A,test_3,5,72
item_2,A,test_3,6,59
item_2,B,test_1,4,73
item_2,B,test_1,5,50
item_2,B,test_1,6,80
item_2,B,test_2,4,107
item_2,B,test_2,5,75
item_2,B,test_2,6,67
item_2,B,test_3,4,119
item_2,B,test_3,5,100
item_2,B,test_3,6,50
答案 1 :(得分:0)
Pandas的融化功能将完全符合您的要求:
import pandas as pd
#read in fixed width file
df = pd.read_fwf('input.csv',header=0)
#Melt the dataframe and sort as in the example provided.
df = pd.melt(df,id_vars=['ID','Flow','TestNa'],value_vars=['4','5','6'],var_name='Label', value_name='Data').sort(['ID','Flow','TestNa','Label'])
#output fixed width file
text_file = open("output.csv", "w")
text_file.write(df.to_string(index=None))
text_file.close()
在输出文件中给出以下内容:
ID Flow TestNa Label Data
item_1 A test_1 4 89
item_1 A test_1 5 51
item_1 A test_1 6 67
item_1 A test_2 4 60
item_1 A test_2 5 67
item_1 A test_2 6 44
item_1 A test_3 4 111
item_1 A test_3 5 82
item_1 A test_3 6 67
item_1 B test_1 4 88
item_1 B test_1 5 78
item_1 B test_1 6 75
item_1 B test_2 4 104
item_1 B test_2 5 66
item_1 B test_2 6 66
item_1 B test_3 4 109
item_1 B test_3 5 87
item_1 B test_3 6 49
item_2 A test_1 4 76
item_2 A test_1 5 76
item_2 A test_1 6 88
item_2 A test_2 4 59
item_2 A test_2 5 44
item_2 A test_2 6 60
item_2 A test_3 4 91
item_2 A test_3 5 72
item_2 A test_3 6 59
item_2 B test_1 4 73
item_2 B test_1 5 50
item_2 B test_1 6 80
item_2 B test_2 4 107
item_2 B test_2 5 75
item_2 B test_2 6 67
item_2 B test_3 4 119
item_2 B test_3 5 100
item_2 B test_3 6 50
注意:我假设您正在使用基于示例表的固定宽度文件。如果您使用的是纯csv,则可以替换以下内容:
df = pd.read_csv('input.csv',header=0)
#Melt the dataframe and sort as in the example provided.
df = pd.melt(df,id_vars=['ID','Flow','TestNa'],value_vars=['4','5','6'],var_name='Label', value_name='Data').sort(['ID','Flow','TestNa','Label'])
df.to_csv('output.csv',index=None)