我是Python的新手。创建熊猫数据框时遇到麻烦。
dataDict = {}
dataDict['grant_id'] = grant_ids
dataDict['patent_title'] = patent_title
dataDict['kind'] = kinds
df=pd.DataFrame(dataDict)
上面的代码在python2中有效,但是当我更改为python3时,出现错误消息:
TypeError Traceback (most recent call last)
<ipython-input-6-3a9900bc5bca> in <module>()
9 #dataDict['abstract'] = abstractResult
10
---> 11 df=pd.DataFrame(dataDict)
12
13 df.head()
3 frames
/usr/local/lib/python3.6/dist-packages/pandas/core/internals/construction.py in extract_index(data)
303 elif is_list_like(val) and getattr(val, 'ndim', 1) == 1:
304 have_raw_arrays = True
--> 305 raw_lengths.append(len(val))
306
307 if not indexes and not raw_lengths:
TypeError: object of type 'map' has no len()
grant_ids is a list of integers.
有没有办法解决?
答案 0 :(得分:1)
问题出在Python 2和3 map
函数返回的差异上。在Python 2中,map
返回一个列表,而在3中,它返回一个生成器。生成器没有长度(因为它们在求值时会得出结果,即不会将所有值存储在内存中)。您可以使用list(generator_object)
或列表理解功能将生成器转到列表中。
dataDict = {}
dataDict['grant_id'] = [id_ for id_ in grant_ids]
dataDict['patent_title'] = [title for title in patent_title]
dataDict['kind'] = [kind for kind in kinds]
df=pd.DataFrame(dataDict)
这应该有效。