python长数据转换成宽数据_通过什么方法可以实现长数据到宽数据的转换?

本文详细介绍了如何使用Python(Pandas和Numpy)读取CSV文件,移除重复项,将数据按项目ID横向扩展,并调整列名。通过定义函数和列表操作,作者展示了如何将数据转换为宽数据格式,便于Excel或其他工具处理。
摘要由CSDN通过智能技术生成

用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.comv2-b834a3057325a3783114510d8cf7171d_180x120.jpg

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值