在python中转换数据表格式

时间:2016-04-06 00:46:11

标签: python numpy

假设我在python中有一个表格,格式如下:

id1 V1 100
id1 V2 200
id1 V3 0
id2 V1 300
id2 V2 400
id2 V3 1   

我希望转换为以下格式:

id1 100 200 0
id2 300 400 1

V1,V2和V3是变量名,我不需要保留它们。我只需要id和每个变量的值。变量数(Vs)也是未知的,但变量的顺序始终相同。我正在寻找一种更智能的转换方式而不是循环方式。有没有内置功能?

1 个答案:

答案 0 :(得分:3)

没有其他内置方法,但您可以使用dict进行分组:

from collections import defaultdict

d  = defaultdict(list)

s = """id1 V1 100
id1 V2 200
id1 V3 0
id2 V1 30
id2 V2 400
id2 V3 1"""

for a, _, c in map(str.split, s.splitlines()):
        d[a].append(c)

print(["{},{}".format(k,",".join(v)) for k,v in d.items()]
['id2,30,400,1', 'id1,100,200,0']

如果您希望输出很好地对齐,您可以执行this

之类的操作

如果您想维护订单,请使用OrderedDict:

from collections import OrderedDict

d  = OrderedDict()

s = """id1 V1 100
id1 V2 200
id1 V3 0
id2 V1 30
id2 V2 400
id2 V3 1"""

for a, _, c in map(str.split, s.splitlines()):
        d.setdefault(a, []).append(c)

如果它在文件中,您可以使用csv lib解析它:

import  csv
from collections import OrderedDict   
d  = OrderedDict()

with open("in.txt") as f:
    for k, _, v in csv.reader(f, delimiter=" "):
        d.setdefault(k, []).append(v)

OrderedDict输出:

OrderedDict([('id1', ['100', '200', '0']), ('id2', ['30', '400', '1'])])