Pandas创建DataFrame的多种方法(附带实例)
DataFrame 是 Pandas 的另一个核心对象,该对象包含一组有序的列,每列可以是不同类型的数据。
当 DataFrame 对象包含多列数据时,其结构类似于 Excel 工作表或数据库应用程序中的表。为了便于标识特定的行、列或行列交错位置上的值,DataFrame 对象同时包含行索引和列索引。
与 Series 对象类似,创建 DataFrame 对象也可以使用多种类型的数据:
使用 Pandas 中的 DataFrame() 函数可以创建 DataFrame 对象,该函数主要有以下 3 个参数:
与创建 Series 对象类似,使用 DataFrame 对象构建数据时,也需要在 Python 中导入 Pandas 库。
上述代码将创建以下数据:
如需创建两列数据,则可以构建一个嵌套列表。下面代码运行的结果可能出乎意料,两个子列表中的数据并没有像上一个示例那样纵向排列,而是横向排列:
可以使用 NumPy 中的 transpose() 函数转置数据的行和列,修改后的代码如下:
如需使行索引和列索引都从1开始编号,可以在创建 DataFrame 对象时指定 index 和 columns 两个参数:
下面的代码可以让行索引和列索引的最大值随着数据范围的大小自动调整,其中的 data[0] 引用第一个子列表。由于两个子列表中的元素个数相同,所以引用哪一个子列表都可以。
下面的代码将创建一个键为 1 和 2 的字典,与每个键关联的值都是一个列表。创建 DataFrame 对象后,使用这两个键作为两列数据的列索引。可以发现,使用这种方法创建的 DataFrame 对象,无须对其中的两组数据的行和列进行转置。
下面的代码是创建单列数据,其行索引就是为 Series 对象设置的索引:
如需创建两列数据,可以创建两个 Series 对象,然后将它们组合在一个字典对象中,并为它们分别提供一个键,这些键将在创建的 DataFrame 对象中被用作列索引。
对于前例来说,可以将第 3 行代码改为以下形式。当包含多列数据时,使用这种方式的输入效率更高。
当 DataFrame 对象包含多列数据时,其结构类似于 Excel 工作表或数据库应用程序中的表。为了便于标识特定的行、列或行列交错位置上的值,DataFrame 对象同时包含行索引和列索引。
与 Series 对象类似,创建 DataFrame 对象也可以使用多种类型的数据:
- Python 中的列表对象;
- Python 中的字典对象;
- NumPy 中的 Ndarray 对象,可以是一维数组或二维数组;
- Pandas 中的 Series 对象。
使用 Pandas 中的 DataFrame() 函数可以创建 DataFrame 对象,该函数主要有以下 3 个参数:
- data:存储在 DataFrame 对象中的数据;
- index:行索引;
- columns:列索引。
与创建 Series 对象类似,使用 DataFrame 对象构建数据时,也需要在 Python 中导入 Pandas 库。
Python列表创建DataFrame对象
下面的代码是使用 Python 中的列表对象作为 data 参数来创建 DataFrame 对象,由于未指定 DataFrame 对象的行索引和列索引,所以默认使用从 0 开始的两组整数序列作为行索引和列索引。data = list('python') df = pd.DataFrame(data)本例中的列表包含 6 个字母,每个字母都是列表中的一个元素,使用该数据创建的 DataFrame 对象包含一列数据,该列数据有 6 行。由于没有指定 index 参数,所以列索引为 0,行索引为 0~5。
上述代码将创建以下数据:
0 0 p 1 y 2 t 3 h 4 o 5 n
如需创建两列数据,则可以构建一个嵌套列表。下面代码运行的结果可能出乎意料,两个子列表中的数据并没有像上一个示例那样纵向排列,而是横向排列:
data = [list('python'), list('pandas')] df = pd.DataFrame(data)上述代码将创建以下数据:
0 1 2 3 4 5 0 p y t h o n 1 p a n d a s
可以使用 NumPy 中的 transpose() 函数转置数据的行和列,修改后的代码如下:
data = [list('python'), list('pandas')] df = pd.DataFrame(np.transpose(data))上述代码将创建以下数据:
0 1 0 p p 1 y a 2 t n 3 h d 4 o a 5 n s
如需使行索引和列索引都从1开始编号,可以在创建 DataFrame 对象时指定 index 和 columns 两个参数:
data = [list('python'), list('pandas')] index = range(1, 7) columns = range(1, 3) df = pd.DataFrame(np.transpose(data), index, columns)上述代码将创建以下数据:
1 2 1 p p 2 y a 3 t n 4 h d 5 o a 6 n s
下面的代码可以让行索引和列索引的最大值随着数据范围的大小自动调整,其中的 data[0] 引用第一个子列表。由于两个子列表中的元素个数相同,所以引用哪一个子列表都可以。
index = range(1, len(data[0]) + 1) column = range(1, len(data) + 1)
Python字典创建DataFrame对象
使用 Python 中的字典对象作为 data 参数来创建 DataFrame 对象时,会自动将字典的键作为 DataFrame 对象的列索引。下面的代码将创建一个键为 1 和 2 的字典,与每个键关联的值都是一个列表。创建 DataFrame 对象后,使用这两个键作为两列数据的列索引。可以发现,使用这种方法创建的 DataFrame 对象,无须对其中的两组数据的行和列进行转置。
data = {1: list('python'), 2: list('pandas')} df = pd.DataFrame(data)上述代码将创建以下数据:
1 2 0 p p 1 y a 2 t n 3 h d 4 o a 5 n s
NumPy Ndarray创建DataFrame对象
下面的代码是使用 NumPy 中的 Ndarray 对象作为 data 参数来创建 DataFrame 对象。由于使用 NumPy 中的 array 函数创建的数组为 2 行 6 列,所以需要使用 Ndarray 对象的 T 属性将该数组转换为 6 行 2 列,然后为其添加从 1 开始编号的行索引和列索引。data = np.array([list('python'), list('pandas')]) df = pd.DataFrame(data.T, range(1, 7), [1, 2])上述代码将创建以下数据:
1 2 0 p p 1 y a 2 t n 3 h d 4 o a 5 n s
Pandas Series创建DataFrame对象
由于 Series 对象本身可以设置索引,所以使用该对象作为 data 参数来创建 DataFrame 对象时,会自动将 Series 对象自身的索引作为 DataFrame 对象的行索引。下面的代码是创建单列数据,其行索引就是为 Series 对象设置的索引:
sr = pd.Series(list('python'), range(1, 7)) df = pd.DataFrame(sr)上述代码将创建以下数据:
0 1 p 2 y 3 t 4 h 5 o 6 n
如需创建两列数据,可以创建两个 Series 对象,然后将它们组合在一个字典对象中,并为它们分别提供一个键,这些键将在创建的 DataFrame 对象中被用作列索引。
sr1 = pd.Series(list('python'), range(1, 7)) sr2 = pd.Series(list('pandas'), range(1, 7)) df = pd.DataFrame({1: sr1, 2: sr2})上述代码将创建以下数据:
1 2 0 p p 1 y a 2 t n 3 h d 4 o a 5 o a 6 n s如果创建的 DataFrame 对象包含多列,则可以使用 dict() 函数和 zip() 函数组合多个键和列表。
对于前例来说,可以将第 3 行代码改为以下形式。当包含多列数据时,使用这种方式的输入效率更高。
df = pd.DataFrame(dict(zip(((1, 2), [sr1, sr2])))