迭代的長到寬Python單線程(或兩個)我正在尋找使用功能和迭代工具將一個較長的數據集變成一個寬的數據集,我的理解是這是一個groupby任務。我問了幾個關於這個問題之前,以爲我是有,但並不完全在這種情況下,這應該是簡單的:使用groupby
- Python functional transformation of JSON list of dictionaries from long to wide
- Correct use of a fold or reduce function to long-to-wide data in python or javascript?
這裏的數據我有:
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},
]
這裏的格式,我希望它在:
>>> widedat=[
{"id":"cat", "best meower": 10, "cleanest paws": 8, "fanciest": 9},
{"id":"dog", "smelly": 9, "dumb": 9},
]
這裏是我的失敗嘗試:
# WRONG
>>> gh = groupby(sorted(longdat,key=id),itemgetter('id'))
>>> list(gh)
[('cat', <itertools._grouper object at 0x5d0b550>), ('dog', <itertools._grouper object at 0x5d0b210>)]
確定,需要獲得第二項到迭代的,不夠公平。
#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}
,只得到第一個結果,而不處理整個列表(超出其看/所有/其中id == '貓'?)
感謝文字,例子描述了你的問題,並顯示你已經研究了什麼,並企圖。這個寫得很好的問題在這些日子裏是很稀缺的。 – IceArdor
謝謝,IceArdor。人們通常會把它稱爲不必要的冗長。 ;) – Mittenchops