从列表后跟数组创建pandas DataFrame会产生错误

时间:2016-12-26 07:53:10

标签: pandas dataframe

当我尝试使用列表后跟数组创建pandas DataFrame时,出现错误:

print(DataFrame([[10,20,30],np.arange(3)]))

TypeError:预期列表,得到numpy.ndarray

但如果我颠倒数据的顺序,那么操作成功:

print(DataFrame([np.arange(3),[10,20,30]]))

你能解释一下原因吗?

1 个答案:

答案 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)