Pandas - 快速创建列和行组中的字典

时间:2017-10-05 14:19:18

标签: python pandas dictionary

我正在尝试从值组中快速创建字典,其中字典中的每个元素都具有与该值相关联的两个其他列的键值对。例如:

我的数据:

                 cheese               x               y
 1  0000000000000005559               1               2
 2  0000000000000005559               2               2
 3  0000000000000004058               3               5
 4  0000000000000004058               4               5
 5  0000000000000004058               5               5

期望的输出:

cheese
0000000000000005559              {1: 2, 2: 2}
0000000000000004058        {3: 5, 4: 5, 5: 5}
0000000000000007157              {6: 7, 7: 7}
0000000000000000815    {8: 10, 9: 10, 10: 10}
0000000000000009160          {11: 12, 12: 12}

我可以使用过于复杂的lambdaapply执行此操作,但对于较大的数据帧(数百万个唯一分组的顺序),这种情况确实很慢。我怎样才能快速实现这一目标?

2 个答案:

答案 0 :(得分:4)

使用defaultdict的方式 这应该很快

from collections import defaultdict

d = defaultdict(dict)

es = df.epoch.values.tolist()
xs = df.x.values.tolist()
ys = df.y.values.tolist()

for e, x, y in zip(es, xs, ys):
    d[e][x] = y

pd.Series(d)

1505339100449045559          {1: 2, 2: 2}
1505339102148504058    {3: 5, 4: 5, 5: 5}
dtype: object

答案 1 :(得分:1)

使用

In [1544]: df.groupby('epoch').apply(lambda x: dict(x[['x', 'y']].values))
Out[1544]:
epoch
1505339100449045559          {1: 2, 2: 2}
1505339102148504058    {3: 5, 4: 5, 5: 5}
dtype: object

df.groupby('epoch')[['x', 'y']].apply(lambda x: dict(x.values))

相同

来自Bharath df.groupby('epoch').apply(lambda x: dict(zip(x['x'], x['y'])))

计时

In [1585]: ndf = pd.concat([df]*1000, ignore_index=True)

In [1587]: %timeit ndf.groupby('epoch').apply(lambda x: dict(zip(x['x'], x['y'])))
100 loops, best of 3: 3.65 ms per loop

In [1586]: %timeit ndf.groupby('epoch')[['x', 'y']].apply(lambda x: dict(x.values))
100 loops, best of 3: 14.9 ms per loop

In [1588]: %timeit ndf.groupby('epoch').apply(lambda x: dict(x[['x', 'y']].values))
100 loops, best of 3: 15.3 ms per loop