使用groupby迭代longtowidepython一行(或两行)

2024-10-02 20:43:32 发布

您现在位置:Python中文网/ 问答频道 /正文

我希望使用功能和迭代工具将长数据集转换为宽数据集,我的理解是这是groupby的一项任务。我之前问过几个关于这个的问题,我想我已经知道了,但在这个例子中,这个问题应该更简单些:

以下是我掌握的数据:

from itertools import groupby
from operator import itemgetter
from pprint import pprint

>>> longdat=[
{"id":"cat", "name" : "best meower", "value": 10},
{"id":"cat", "name" : "cleanest paws", "value": 8},
{"id":"cat", "name" : "fanciest", "value": 9},
{"id":"dog", "name" : "smelly", "value": 9},
{"id":"dog", "name" : "dumb", "value": 9},
]

以下是我想要的格式:

^{pr2}$

以下是我失败的尝试:

^{3}$

好的,需要从迭代器中取出第二个项目,这很公平。在

#WRONG
>>> gh = groupby(sorted(longdat,key=id),itemgetter('id'))
>>> for g,v in gh:
...     {"id":i["id"], i["name"]:i["value"] for i in v}
                                      ^
SyntaxError: invalid syntax

很奇怪,它看起来是有效的。让我们解开这些环来确保。在

#WRONG
gb = groupby(sorted(longdat,key=id),itemgetter('id'))
data = {}
for g,v in gb:
    data[g] = {}
    for i in v:
        data[g] = i

#WRONG
gb = groupby(sorted(longdat,key=id),itemgetter('id'))
data = []
for g,v in gb:
    for i in v:
        data[g] = i

啊!好的,我们回到单线形式

#WRONG
>>> gb = groupby(sorted(longdat,key=id),itemgetter('id'))
>>> [{"id":g, i["name"]:i["value"]} for i in k for g,k in gb]
[]

什么?为什么是空的?!让我们再次放松一下:

#WRONG
gb = groupby(sorted(longdat,key=id),itemgetter('id'))
for g,k in gb:
    for i in k:
       print(g, i["name"],i["value"])
cat best meower 10
cat fanciest 9
cat cleanest paws 8
dog smelly 9
dog dumb 9

现在,最后一个显然是最糟糕的——很明显,我的数据基本上回到了它开始的地方,好像我根本就没有groupby一样。在

为什么这不起作用,我怎么才能得到我想要的格式?在

还有,有没有可能完全重复地用这个词来表达我能做到的

>>> result[0]
{"id":"cat", "best meower": 10, "cleanest paws": 8, "fanciest": 9}

只得到第一个结果而不处理整个列表(除了必须查看/all/where id=='cat'?)在


Tags: 数据keynameinidfordatavalue
1条回答
网友
1楼 · 发布于 2024-10-02 20:43:32

传递给sorted函数的key函数是^{}。它将为所有列表项返回所有不同的值。在

它应该是itemgetter('id')或{}。在

>>> id(longdat[0])
41859624L
>>> id(longdat[1])
41860488L
>>> id(longdat[2])
41860200L
>>> itemgetter('id')(longdat[1])
'cat'
>>> itemgetter('id')(longdat[2])
'cat'
>>> itemgetter('id')(longdat[3])
'cat'

^{pr2}$

输出:

[{'best meower': 10, 'fanciest': 9, 'id': 'cat', 'cleanest paws': 8},
 {'dumb': 9, 'smelly': 9, 'id': 'dog'}]

相关问题 更多 >