我想创建一个矩阵.
输入:
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]]
编辑
通过@wwii建议.使用Pandas看起来不错:
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]]
解决方法:
我使用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')
标签:python,pandas,matrix