如何根据特定的键值重新排列字典。如果我有字典:
data = {'X':[0,1,2,3], 'Frame':[0,1,2,3], 'Particle':[1,1,2,2]}
如何根据粒子值拆分/重新排列字典,以便得到:
# Arranged by particle
data1 = {'1': {'X':[0,1], 'Frame':[0,1]},
'2': {'X':[2,3], 'Frame':[2,3]}}
我怎么能转换回原来的。
考虑创建一个具有 X、帧和粒子属性的类。然后,您可以拥有一个相对简单的对象列表,而不是使用包含并行列表的字典,可以根据需要对其进行排序和分组。
import itertools
class Sprocket:
def __init__(self, x, frame, particle):
self.x = x
self.frame = frame
self.particle = particle
data = [
Sprocket(0,0,1),
Sprocket(1,1,1),
Sprocket(2,2,2),
Sprocket(3,3,2),
]
#now we arrange them by particle.
arrange_func = lambda item: item.particle
data.sort(key=arrange_func)
for particle, sprockets in itertools.groupby(data, key=arrange_func):
print "sprockets with particle {}:".format(particle)
for sprocket in sprockets:
print sprocket.x, sprocket.frame, sprocket.particle
结果:
sprockets with particle 1:
0 0 1
1 1 1
sprockets with particle 2:
2 2 2
3 3 2
。如果你真的想,你可以用它来构建你的字典。
arrange_func = lambda item: item.particle
data.sort(key=arrange_func)
d = {}
for particle, sprockets in itertools.groupby(data, key=arrange_func):
d[particle] = {"X":[], "Frame":[]}
for sprocket in sprockets:
d[particle]["X"].append(sprocket.x)
d[particle]["Frame"].append(sprocket.frame)
print d
结果:
{1: {'X': [0, 1], 'Frame': [0, 1]}, 2: {'X': [2, 3], 'Frame': [2, 3]}}
@Kevin感谢您的回答,但我找到了熊猫的解决方案:
import pandas as pd
data = {'X':[0,1,2,3], 'Frame':[0,1,2,3], 'Particle':[2,2,4,5]}
print data, 'n'
df = pd.DataFrame(data)
grouped = df.groupby(['Particle'])
d = {}
for name, group in grouped:
d[name] = group.to_dict('list')
print d, 'n'
# For the return journey:
pieces = []
for key, value in d.iteritems():
pieces.append(pd.DataFrame(value))
concatenated = pd.concat(pieces)
print concatenated.to_dict('list')
输出是:
{'X': [0, 1, 2, 3], 'Frame': [0, 1, 2, 3], 'Particle': [2, 2, 4, 5]}
{2: {'X': [0, 1], 'Frame': [0, 1], 'Particle': [2, 2]}, 4: {'X': [2], 'Frame': [2], 'Particle': [4]}, 5: {'X': [3], 'Frame': [3], 'Particle': [5]}}
{'X': [0, 1, 2, 3], 'Frame': [0, 1, 2, 3], 'Particle': [2, 2, 4, 5]}