首页 > 解决方案 > 使用列表与字典的数据框

问题描述

import pandas as pd

pincodes = [800678,800456]
numbers = [2567890, 256757]
labels = ['R','M']
first = pd.DataFrame({'Number':numbers, 'Pincode':pincodes},
                     index=labels)
print(first)

上面的代码给了我以下(正确的)数据框。

    Number  Pincode
R  2567890   800678
M   256757   800456

但是,当我使用这个语句时,

second = pd.DataFrame([numbers,pincodes],
                      index=labels, columns=['Number','Pincode'])
print(second)

然后我得到以下(不正确的)输出。

    Number  Pincode
R  2567890   256757
M   800678   800456

如您所见,这两个数据框是不同的。为什么会这样?这本字典与列表方法有什么不同?

标签: pythonpandasdata-wrangling

解决方案


的构造函数pd.DataFrame()包括此文档。

Init signature: pd.DataFrame(data=None, index=None, columns=None, dtype=None, copy=False)
Docstring:
...

Parameters
----------
data : ndarray (structured or homogeneous), Iterable, dict, or DataFrame
    Dict can contain Series, arrays, constants, or list-like objects

    .. versionchanged :: 0.23.0
       If data is a dict, column order follows insertion-order for
       Python 3.6 and later.

    .. versionchanged :: 0.25.0
       If data is a list of dicts, column order follows insertion-order
       for Python 3.6 and later.

关键字是column。在第一种方法中,您正确地告诉 pandas 那numbers是带有 label 的列'Numbers'。但是在第二种方法中,您告诉 pandas 列是'Numbers'and'Pincode'并从列表列表中获取数据[numbers, pincodes]。此列表列表的第一'Numbers'分配给该列,第二列分配给该'Pincode'列。

如果您想以这种方式输入数据(而不是作为字典),则需要转置列表列表。

>>> import numpy as np

# old way
>>> pd.DataFrame([numbers,pincodes],
                 index=labels,columns=['Number','Pincode'])
    Number  Pincode
R  2567890   256757
M   800678   800456

# Transpose the data instead so the rows become the columns.
>>> pd.DataFrame(np.transpose([numbers,pincodes]),
                 index=labels,columns=['Number','Pincode'])
    Number  Pincode
R  2567890   800678
M   256757   800456

推荐阅读