跳转至

9.2.DataFra

from toolkit import H
from pandas import DataFrame
from pandas import Series
import numpy as np
Windows 10
Python 3.8.8 @ MSC v.1928 64 bit (AMD64)
Latest build date 2021.02.27
pandas version:  1.2.2
numpy version:  1.20.1

DataFrame类

DataFrame是一个表格型的数据结构,它含有一组有序的列,每列可以是不同的值类型1(数值、字符串、布尔值等)。DataFrame既有行索引也有列索引,它可以被看做是Series的容器。

pandas中的DataFrame可以使用以下构造函数创建:

DataFrame(data=None, index=None, columns=None, dtype=None, copy=False)
  • data:数据可以是各种形式,如:ndarrayseriesmaplistsdictconstant和另一个DataFrame
  • index:行标签。默认为np.arrange(n)
  • columns:列标签。默认为np.arrange(n)
  • dtype:数据类型。
  • copy:是否复制数据。

可以输入给DataFrame构造器的数据:

类型 说明
二维ndarray
由list或tuple组成的list 类似于“二维ndarray”
由数组、列表或元组组成的字典 每个序列作为DataFrame的一列。所有序列的长度必须相同
由Series组成的字典 每个Series会成为一列。如果没有显式指定index,则 各Series的index会被合并成结果的行索引。每个Series的长度不要求必须相同,DataFrame会以NaN填充。
NumPy的结构化/记录数组 类似于“由数组组成的字典”
由字典组成的字典 各内层字典会成为一列。键会被合并成结果的行索引,跟由“Series组成的字典”的情况一样
字典或Series的列表 各项将会成为DataFrame的一行。字典键或Series索引的并集将会成为DataFrame的列标
另—个DataFrame 该DataFrame的索引将会被沿用,除非显式指定了其他索引
NumPy 的 Masked Array 类似于“二维ndarray”的情况,只是掩码值在结果 DataFrame会变成NA/缺失值

总的来说,支持输入的数据类型是:dictlistndarrayDataFrame

从列表创建

可以使用单个列表列表内嵌列表来创建DataFrame。

单个列表的例子:

data = [1, 2, 3, 4, 5]
DataFrame(data)
   0
0  1
1  2
2  3
3  4
4  5

列表内嵌列表的例子:

data = [['Alex', 10], ['Bob', 12], ['Clarke', 13]]
DataFrame(data, columns=['Name', 'Age'])
     Name  Age
0    Alex   10
1     Bob   12
2  Clarke   13

从包含array/List/Series的字典创建

传入一个由等长list、ndarray组成的字典:

结果DataFrame会自动加上索引(跟Series一样),且全部列会被有序排列。

data = {'state': ['Ohio', 'Ohio', 'Ohio', 'Nevada', 'Nevada'],
        'year': [2000, 2001, 2002, 2001, 2002],
        'pop': [1.5, 1.7, 3.6, 2.4, 2.9]}
DataFrame(data)
    state  year  pop
0    Ohio  2000  1.5
1    Ohio  2001  1.7
2    Ohio  2002  3.6
3  Nevada  2001  2.4
4  Nevada  2002  2.9

如果指定了列序列,则DataFrame的列就会按照指定顺序进行排列:

DataFrame(data, columns=['year', 'state', 'pop'])
   year   state  pop
0  2000    Ohio  1.5
1  2001    Ohio  1.7
2  2002    Ohio  3.6
3  2001  Nevada  2.4
4  2002  Nevada  2.9

传入一个由等长Series或不等长Series组成的字典:

data = {'state': Series(['Ohio', 'Ohio', 'Nevada'], index=['a', 'b', 'c']),
        'year': Series([2000, 2002, 2001, 2002], index=['a', 'b', 'c', 'd']),
        'pop': Series([1.7, 3.6, 2.4], index=['b', 'c', 'd'])}

DataFrame(data)
    state  year  pop
a    Ohio  2000  NaN
b    Ohio  2002  1.7
c  Nevada  2001  3.6
d     NaN  2002  2.4

从字典列表创建

data = [{'a': 1, 'b': 2}, {'a': 5, 'b': 10, 'c': 20}]
DataFrame(data, index=['first', 'second'])
        a   b     c
first   1   2   NaN
second  5  10  20.0

替代构造函数

DataFrame.from_dict

DataFrame.from_dict(data, orient='columns', dtype=None, columns=None)

DataFrame.from_dict接受dict或类似数组的序列的dict并返回DataFrame。

DataFrame.from_dict(dict([('A', [1, 2, 3]), ('B', [4, 5, 6])]))

DataFrame.from_dict(dict([('A', [1, 2, 3]), ('B', [4, 5, 6])]),
                    orient='index', columns=['one', 'two', 'three'])
   one  two  three
A    1    2      3
B    4    5      6

DataFrame.from_records

DataFrame.from_records(data, index=None, exclude=None, columns=None,
                       coerce_float=False, nrows=None)

DataFrame.from_records接受具有结构化dtype的元组或ndarray的列表。它与普通的DataFrame构造函数相似,除了所得的DataFrame索引可能是结构化dtype的特定字段。例如:

data = np.array([(1, 2., b'Hello'), (2, 3., b'World')],
                dtype=[('A', '<i4'), ('B', '<f4'), ('C', 'S10')])

DataFrame.from_records(data, index='C')
          A    B
C
b'Hello'  1  2.0
b'World'  2  3.0

DataFrame.from_items

从元组序列中创建DataFrame

DataFrame.from_items(items, columns=None, orient='columns')
  • items: 为元组序列,元组格式为:(key, value)
  • columns:列标签。当orient='index'时必须传入columns。当orient='columns'时,key就是列的label,此时columns参数指定的列label必须等于某个key,否则抛出异常。
  • orient:数据的方向,{'index', 'columns'}

DataFrame.from_items类方法从pandas 0.23版本起不再推荐使用,在未来的版本中会被移除。

print("pandas version:", pd.__version__)
print("Has 'from_items' attr?", hasattr(DataFrame, "from_items"))
pandas version: 1.2.2
Has 'from_items' attr? False

  1. 实际上,DataFrame每一个值都可以是不同的数据类型。