Python 从动态字典创建矩阵
我想创建一个矩阵 输入:Python 从动态字典创建矩阵,python,matrix,pandas,Python,Matrix,Pandas,我想创建一个矩阵 输入: data = [ {'a': 2, 'g': 1}, {'p': 3, 'a': 5, 'cat': 4} ... ] a p cat g 1st 2 0 0 1 2nd 5 3 4 0 输出: data = [ {'a': 2, 'g': 1}, {'p': 3, 'a': 5, 'cat': 4} ... ] a p cat g 1st 2 0 0
data = [
{'a': 2, 'g': 1},
{'p': 3, 'a': 5, 'cat': 4}
...
]
a p cat g
1st 2 0 0 1
2nd 5 3 4 0
输出:
data = [
{'a': 2, 'g': 1},
{'p': 3, 'a': 5, 'cat': 4}
...
]
a p cat g
1st 2 0 0 1
2nd 5 3 4 0
这是我的代码。但我认为当数据量很大时,它并不聪明,而且非常慢
有什么好方法可以做这个吗
多谢各位
data = [
{'a': 2, 'g': 1},
{'p': 3, 'a': 5, 'cat': 4}
]
### Get keyword map ###
key_map = set()
for row in data:
key_map = key_map.union(set(row.keys()))
key_map = list(key_map) # ['a', 'p', 'g', 'cat']
### Create matrix ###
result = []
for row in data:
matrix = [0] * len(key_map)
for k, v in row.iteritems():
matrix[key_map.index(k)] = v
result.append(matrix)
print result
# [[2, 0, 0, 1], [5, 3, 4, 0]]
已编辑
第二次世界大战的建议。使用看起来不错:
from pandas import DataFrame
result = DataFrame(data, index=range(len(data)))
print result.fillna(0, downcast=int).as_matrix().tolist()
# [[2, 0, 1, 0], [5, 4, 0, 3]]
我是python的新手,希望能提供一些有用的建议:) 您可以将中间部分更改为此,这将节省您查找关键点地图的时间
在您的情况下,
union
至少会扫描每一行,以找到不同的项目。您可以使用set comprehension生成键映射图
key_map = list({data for row in data for data in row})
以下是部分答案。我无法按指定的顺序获取列-这受集合中键的排序方式限制,
key\u map
。它使用字符串格式将数据排成一行-您可以随意调整间距以适应较大或较小的数字
# ordinal from
# http://code.activestate.com/recipes/576888-format-a-number-as-an-ordinal/
from ordinal import ordinal
data = [
{'a': 2, 'g': 1},
{'p': 3, 'a': 5, 'cat': 4}
]
### Get keyword map ###
key_map = set()
for row in data:
key_map = key_map.union(set(row.keys()))
key_map = list(key_map) # ['a', 'p', 'g', 'cat']
# strings to format the output
header = '{: >10}{: >8}{: >8}{: >8}'.format(*key_map)
line_fmt = '{: <8}{: >2}{: >8}{: >8}{: >8}'
print header
def ordered_data(d, keys):
"""Returns an ordered list of dictionary values.
returns 0 if key not in d
d --> dict
keys --> list of keys
returns list
"""
return [d.get(key, 0) for key in keys]
for i, thing in enumerate(data):
print line_fmt.format(ordinal(i+1), *ordered_data(thing, key_map))
也许值得深入研究Pandas文档并查看它的功能,这可能会让生活更轻松。我使用Pandas数据框支持这个答案。然而,我的代码应该比你的代码简单一点
In [1]: import pandas as pd
In [5]: data = [{'a': 2, 'g': 1},{'p': 3, 'a': 5, 'cat': 4}]
In [6]: df = pd.DataFrame(data)
In [7]: df
Out[7]:
a cat g p
0 2 NaN 1 NaN
1 5 4 NaN 3
In [9]: df = df.fillna(0)
In [10]: df
Out[10]:
a cat g p
0 2 0 1 0
1 5 4 0 3
我用iPython编写代码,我强烈推荐
要保存到csv,只需使用额外的代码行:
df.to_csv('filename.csv')
我对这段代码进行了测试,它确实比我的代码快,速度如何?谢谢你的建议。:)@fyr0049其名称为。巨蟒的灵魂中有理解力。看来我可能误解了这个问题!再一次!。我会把它放下,看看会发生什么。好的,我会尝试使用熊猫。谢谢