当我尝试使用列表后跟数组创建pandas DataFrame时,出现错误:
print(DataFrame([[10,20,30],np.arange(3)]))
TypeError:预期列表,得到numpy.ndarray
但如果我颠倒数据的顺序,那么操作成功:
print(DataFrame([np.arange(3),[10,20,30]]))
你能解释一下原因吗?
答案 0 :(得分:1)
这可以给你一个粗略的想法。对数据参数有多个检查。如果data参数是一个项目列表,那么下面的代码将在引擎盖下执行。检查列表的第一个元素。如果它是一个列表然后它进入listlike块但是如果它的ndarray它进入ndarray块。列表块无法处理ndarray,但ndarray块可以处理列表。这就是为什么你不会犯错误。
elif isinstance(data, (list, types.GeneratorType)):
if isinstance(data, types.GeneratorType):
data = list(data)
if len(data) > 0:
-------> #IF FIRST ELEMENT IS LIST ENTER THIS BLOCK
if is_list_like(data[0]) and getattr(data[0], 'ndim', 1) == 1:
if is_named_tuple(data[0]) and columns is None:
columns = data[0]._fields
arrays, columns = _to_arrays(data, columns, dtype=dtype)
columns = _ensure_index(columns)
# set the index
if index is None:
if isinstance(data[0], Series):
index = _get_names_from_index(data)
elif isinstance(data[0], Categorical):
index = _default_index(len(data[0]))
else:
index = _default_index(len(data))
mgr = _arrays_to_mgr(arrays, columns, index, columns,
dtype=dtype)
------> #ELSE ENTER THIS BLOCK
else:
mgr = self._init_ndarray(data, index, columns, dtype=dtype,
copy=copy)
else:
mgr = self._init_dict({}, index, columns, dtype=dtype)