用python的话,能用pandas和numpy么?先假如不能用吧,就斋csv
首先假定图片上部的数据存到了桌面的long.csv里:
Project ID,alters,q1,q2,q3
1,Mike,2,3,2
1,John,2,2,1
1,Lisa,2,2,1
2,Peter,3,1,3
2,Paul,3,2,3
3,Susan,2,1,3
3,Jack,1,3,3
3,Selina,2,3,1
整体步骤:读取文件
对Project ID这一列去除重复项,获得一个列表ids
遍历ids的元素,提取每一个元素在csv里对应的行,作为这个元素下辖的记录
在3的过程中记录各个元素下辖记录的数量,保留最大值
遍历ids的元素,横向输出下辖元素
下面的程序在ipython里面输入:
切换工作文件夹
In [3]: cd c:\Users
c:\Users
In [4]: cd kyk/Desktop/
c:\Users\kyk\Desktop
打开文件,读取
In [5]: f = open('long.csv')
In [6]: import csv
In [7]: df = csv.reader(f)
转成list,顺便看一眼数据
In [10]: df = list(df)
In [11]: df
Out[11]:
[['Project ID', 'alters', 'q1', 'q2', 'q3'],
['1', 'Mike', '2', '3', '2'],
['1', 'John', '2', '2', '1'],
['1', 'Lisa', '2', '2', '1'],
['2', 'Peter', '3', '1', '3'],
['2', 'Paul', '3', '2', '3'],
['3', 'Susan', '2', '1', '3'],
['3', 'Jack', '1', '3', '3'],
['3', 'Selina', '2', '3', '1']]
做一个小的功能函数,获取某一列数据:
In [37]: def columnGet(csvdata,cNum):
...: return [row[cNum] for row in csvdata]
...:
In [38]: columnGet(df,0)
Out[38]: ['Project ID', '1', '1', '1', '2', '2', '3', '3', '3']
然后从project ID里面提取唯一值:
In [39]: ids = list(set(columnGet(df,0)[1:]))
In [40]: ids
Out[40]: ['1', '3', '2']
遍历ids的元素,提取每一个元素在csv里对应的行,作为这个元素下辖的记录
In [52]: width = 0
In [53]: wide = []
In [55]: for e in ids:
...: rows = [r for r in df if r[0]==e]
...: wide.append((e,rows))
...: if len(rows)>width:
...: width = len(rows)
In [56]: width
Out[56]: 3
In [57]: wide
Out[57]:
[ ('1',
[['1', 'Mike', '2', '3', '2'],
['1', 'John', '2', '2', '1'],
['1', 'Lisa', '2', '2', '1']]),
('3',
[['3', 'Susan', '2', '1', '3'],
['3', 'Jack', '1', '3', '3'],
['3', 'Selina', '2', '3', '1']]),
('2', [['2', 'Peter', '3', '1', '3'], ['2', 'Paul', '3', '2', '3']])]
下辖元素已经分配好了
输出
表头部分你要求alter有1,2,3这样的变化,所以还需要额外做点调整:
In [73]: def headerGen(df,width):
...: headerRepeat = df[0][1:]
...: headerAlter = headerRepeat[0]
...: headerRst = [df[0][0]]
...: for i in range(width):
...: headerRepeat[0]=headerAlter+str(i+1)
...: headerRst += headerRepeat
...: return headerRst
...:
In [74]: headerGen(df,width)
Out[74]:
['Project ID',
'alters1',
'q1',
'q2',
'q3',
'alters2',
'q1',
'q2',
'q3',
'alters3',
'q1',
'q2',
'q3']
然后是输出下辖元素
In [84]: content = []
In [85]: for e in wide:
...: row = [e[0]]
...: for child in e[1]:
...: row += child[1:]
...: content.append(row)
...:
...:
In [86]: content
Out[86]:
[ ['1', 'Mike', '2', '3', '2', 'John', '2', '2', '1', 'Lisa', '2', '2', '1'],
['3', 'Susan', '2', '1', '3', 'Jack', '1', '3', '3', 'Selina', '2', '3', '1'],
['2', 'Peter', '3', '1', '3', 'Paul', '3', '2', '3']]
表头和内容拼起来,输出成csv
In [89]: rst = [headerGen(df,width)]+content
In [93]: outputFile = open('output.csv','w',newline='')
In [94]: outputWriter = csv.writer(outputFile)
In [95]: for r in rst:
...: outputWriter.writerow(r)
...:
In [96]: outputFile.close()
输出结果截图
没有排序,不过这个在excel里面很容易的啦
用普通python写的脚本可以去这里:路人乙小明:[python]重复数据的横向展开(长数据转成宽数据)zhuanlan.zhihu.com