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

在python中将字典转换为numpy矩阵,python,numpy,dictionary,matrix,Python,Numpy,Dictionary,Matrix,我是python初学者。我有一本字典如下: {'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'

我是python初学者。我有一本字典如下:

{'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矩阵


我遇到的一个问题是,这些数据有超过百万次的观测。因此,在它上面循环将永远需要时间。我想使用字典作为岭回归的特征向量。

这是一个开始。在这一点上我并不担心速度(python3.4版的Ipython)

为了制作一个记录数组,我需要一个元组列表,每个元组的每个字段都有一个值。第一个记录包含键值对。但价值是一个列表

(这些值列表显然是使用带有列表附加的默认字典的结果。这是构建字典的好方法,但不幸的是,对于数组,我们必须将其解包。)

更好-具有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))
...
定义数据类型:

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')])
[491]中的
:dt=np.dtype([('name','U10'),('idential',float),('vote',int),('review','U100'))
在[492]中:data=np.数组(ll1,dt)
在[493]中:数据
出[493]:
数组([('Alexander',-0.1,50',),('Alexander',-0.95,20',),
('Alexander',-0.19,19',),('Alexander',-0.2,30,'Good'),
(‘克林顿’,-0.5,80,),(‘克林顿’,-0.75,90,),
(‘克林顿’,-0.8999,),
(‘克林顿’,-0.5,80,‘她是总统候选人’),

dtype=[('name','由于数据来自
json
文件,因此可以使用函数将其加载到Pandas中。这将创建包含所需列的数据框。要运行岭回归,可以使用scikit learn中的类(更多信息)。作为Python初学者,pandas和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轴,所有配置都出错了。您可能需要通过
pandas.read_json()的
orient
参数提供格式字符串
。也就是说,阅读相关文档后,这应该会让您了解如何开始。

其价值在于:Pandas可以轻松地从dict创建数据帧。但是除了Pandas,您是否尝试过创建空的结构化数组,并在dict和内部列表上使用循环来填充ar雷?“埃弗特,我试过了,但是问题是数据有超过百万次的观察。所以循环它将需要时间。我想用字典作为脊回归的特征向量。在这种情况下你应该考虑熊猫。另一件事。这可能是XY问题的一个例子,因为我猜测你的数据不是从A开始的。字典。它是从哪里来的?数据库、CSV文件还是其他地方?
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')])
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)