在python中将字典转换为numpy矩阵

时间:2015-11-18 03:52:12

标签: python numpy dictionary matrix

我是一名蟒蛇初学者。我有一个如下字典:

{'Clinton': [{'ideology': -0.5, 'vote':80}, {'ideology': -0.75, 'vote':90},
 {'ideology': -0.89, 'vote': 99}, 
{'ideology': -0.5, 'vote':80, 'review': "She is a presidential candidate"}],
 'Alexander': [{'ideology': -0.1, 'vote':50}, {'ideology': -0.95, 'vote':20}, 
{'ideology': -0.19, 'vote': 19}, {'ideology': -0.2, 'vote':30, 'review': "Good"}] 
... }

我想将这个字典转换成一个numpy矩阵,就像将该名称创建为一列一样,如:

   Name  ideology vote review
  Clinton  -0.5    80
  Clinton  -0.75   90
  Clinton  -0.89   99
  Clinton  -0.5    80   "She is a presidential candidate"
 Alexander -0.1    50
 Alexander -0.95   20
 Alexander -0.19   19
 Alexander -0.2    30   "Good"

如何将此字典转换为numpy矩阵?

我遇到的一个问题是数据有超过百万的观察结果。所以循环它将需要时间永远。我想使用字典作为岭回归的特征向量。

2 个答案:

答案 0 :(得分:0)

这是一个开始。我现在并不担心速度(Ipython with python3.4)

In [473]: dd = {'Clinton': [{'ideology': -0.5, 'vote':80}, {'ideology': -0.75, 'vote':90},
 {'ideology': -0.89, 'vote': 99}, 
{'ideology': -0.5, 'vote':80, 'review': "She is a presidential candidate"}],
 'Alexander': [{'ideology': -0.1, 'vote':50}, {'ideology': -0.95, 'vote':20}, 
{'ideology': -0.19, 'vote': 19}, {'ideology': -0.2, 'vote':30, 'review': "Good"}]}
...
In [475]: dd
Out[475]: 
{'Alexander': [{'ideology': -0.1, 'vote': 50},
  {'ideology': -0.95, 'vote': 20},
  {'ideology': -0.19, 'vote': 19},
  {'ideology': -0.2, 'vote': 30, 'review': 'Good'}],
 'Clinton': [{'ideology': -0.5, 'vote': 80},
  {'ideology': -0.75, 'vote': 90},
  {'ideology': -0.89, 'vote': 99},
  {'ideology': -0.5, 'vote': 80, 'review': 'She is a presidential candidate'}]}
In [476]: dd.keys()
Out[476]: dict_keys(['Alexander', 'Clinton'])
In [478]: dd.values()
Out[478]: dict_values([[{'ideology': -0.1, 'vote': 50}, {'ideology': -0.95, 'vote': 20}, {'ideology':....}]])
...

要创建一个记录数组,我需要一个元组列表,每个元组都有一个每个字段的值。具有键值对的第一个记录。但价值是一个清单。

(这些值列表显然是使用带有列表追加的默认字典的结果。这是构建字典的一种很好的方法,但不幸的是,对于数组我们必须解压缩它。)

In [480]: [(k,v) for k,v in dd.items()]
Out[480]: 
[('Alexander',
  [{'ideology': -0.1, 'vote': 50},
   {'ideology': -0.95, 'vote': 20},
   ....
    'review': 'She is a presidential candidate'}])]

更好 - 包含3个字段的元组列表列表:

In [483]: [[(k,vv['ideology'],vv['vote']) for vv in v] for k,v in dd.items()]
Out[483]: 
[[('Alexander', -0.1, 50),
  ('Alexander', -0.95, 20),
  ('Alexander', -0.19, 19),
  ('Alexander', -0.2, 30)],
 [('Clinton', -0.5, 80),
  ('Clinton', -0.75, 90),
  ('Clinton', -0.89, 99),
  ('Clinton', -0.5, 80)]]

添加可能缺少的review字段

In [484]: [[(k,vv['ideology'],vv['vote'],vv.get('review','')) for vv in v] for k,v in dd.items()]
Out[484]: 
[[('Alexander', -0.1, 50, ''),
  ('Alexander', -0.95, 20, ''),
  ('Alexander', -0.19, 19, ''),
  ('Alexander', -0.2, 30, 'Good')],
 [('Clinton', -0.5, 80, ''),
  ('Clinton', -0.75, 90, ''),
  ('Clinton', -0.89, 99, ''),
  ('Clinton', -0.5, 80, 'She is a presidential candidate')]]
In [485]: ll=[[(k,vv['ideology'],vv['vote'],vv.get('review','')) for vv in v] for k,v in dd.items()]

要展开列表中的列表,请使用intertools链

In [486]: from itertools import chain
...
In [488]: list(chain(*ll))
Out[488]: 
[('Alexander', -0.1, 50, ''),
 ('Alexander', -0.95, 20, ''),
 ('Alexander', -0.19, 19, ''),
 ('Alexander', -0.2, 30, 'Good'),
 ('Clinton', -0.5, 80, ''),
 ('Clinton', -0.75, 90, ''),
 ('Clinton', -0.89, 99, ''),
 ('Clinton', -0.5, 80, 'She is a presidential candidate')]
In [489]: ll1=list(chain(*ll))
...

定义dtype:

In [491]: dt=np.dtype([('name','U10'),('ideology',float),('vote',int),('review','U100')])

In [492]: data=np.array(ll1,dt)
In [493]: data
Out[493]: 
array([('Alexander', -0.1, 50, ''), ('Alexander', -0.95, 20, ''),
       ('Alexander', -0.19, 19, ''), ('Alexander', -0.2, 30, 'Good'),
       ('Clinton', -0.5, 80, ''), ('Clinton', -0.75, 90, ''),
       ('Clinton', -0.89, 99, ''),
       ('Clinton', -0.5, 80, 'She is a presidential candidate')], 
      dtype=[('name', '<U10'), ('ideology', '<f8'), ('vote', '<i4'), ('review', '<U100')])

看起来不错。在最后一个数组创建步骤中没有迭代。将字典转换为元组列表时有一个迭代。但是在使用字典时,这种迭代是不可避免的。

答案 1 :(得分:0)

由于您的数据来自json文件,因此您可以使用read_json()函数将其加载到Pandas中。这将创建一个包含所需列的数据框。要运行岭回归,您可以使用scikit learn中的Ridge类(更多信息here)。作为Python初学者,值得学习熊猫和scikit。它们是用于数据分析和挖掘的流行软件包,将为您提供所需的大多数工具。结合两个站点上的示例:

from sklearn.linear_model import Ridge
import pandas
df = pandas.read_json('json.gz')
y = df['vote']
X = df['ideology']
clf = Ridge(alpha=1.0)
clf.fit(X, y)

这只是一个粗略的例子。我可能会翻转你的x轴和y轴,并且所有配置都错了。您可能需要通过orient pandas.read_json()参数提供格式字符串。话虽如此,一旦您阅读了相关文档,这应该可以让您了解如何开始。