如何按值排列字典,然后再排列



如何根据特定的键值重新排列字典。如果我有字典:

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]}

相关内容

最新更新