这篇随笔主要介绍 Pandas 的两种数据类型:Series 和 DataFrame 相关的内容
Pt.1 部分主要介绍对 Pandas 两种数据类型的基本操作,包括创建、索引和修改
Pt.2 部分详细介绍了 Pandas 的索引操作
Pt.3 部分主要介绍了 Pandas 的计算和函数
Pt.4 部分详细介绍了 Pandas 的统计计算相关的函数
1 2 3
| import numpy as np import pandas as pd from pandas import Series, DataFrame
|
pandas 的数据结构 - Series
pd.Series( data, index )
1 2
| obj = pd.Series([4, 7, -5, 3]) obj
|
1 2 3 4 5
| 0 4 1 7 2 -5 3 3 dtype: int64
|
1 2
| obj2 = pd.Series([4, 7, -5, 3], index=['q', 'w', 'e', 'r']) obj2
|
1 2 3 4 5
| q 4 w 7 e -5 r 3 dtype: int64
|
可以通过 Series 的 values 和 index 属性获取其数组表示形式和索引对象
1 2 3 4
| print(obj.values) print(obj.index) print(obj2.values) print(obj2.index)
|
1 2 3 4
| [ 4 7 -5 3] RangeIndex(start=0, stop=4, step=1) [ 4 7 -5 3] Index(['q', 'w', 'e', 'r'], dtype='object')
|
Series 的 index 可以通过赋值的方式就地修改
1 2
| obj.index = ['Bob', 'Steve', 'Jeff', 'Ryan'] obj
|
1 2 3 4 5
| Bob 4 Steve 7 Jeff -5 Ryan 3 dtype: int64
|
pd.Series( dict ) : 通过字典创建 Series
1 2 3
| sdata = {'Ohio': 35000, 'Texas': 71000, 'Oregon': 16000, 'Utah': 5000} obj3 = pd.Series(sdata) obj3
|
1 2 3 4 5
| Ohio 35000 Texas 71000 Oregon 16000 Utah 5000 dtype: int64
|
1 2 3
| states = ['California', 'Ohio', 'Oregon', 'Texas'] obj4 = pd.Series(sdata, index=states) obj4
|
1 2 3 4 5
| California NaN Ohio 35000.0 Oregon 16000.0 Texas 71000.0 dtype: float64
|
pd.isnull( obj ), pd.notnull( obj ) : 检测缺失数据
1
| pd.isnull(obj4), pd.notnull(obj4)
|
1 2 3 4 5 6 7 8 9 10
| (California True Ohio False Oregon False Texas False dtype: bool, California False Ohio True Oregon True Texas True dtype: bool)
|
Series 的索引与运算
1
| obj2['w'], obj2[['w']], obj2[['r', 'q', 'e']]
|
1 2 3 4 5 6 7
| (7, w 7 dtype: int64, r 3 q 4 e -5 dtype: int64)
|
1 2 3 4
| q 4 w 7 r 3 dtype: int64
|
1 2 3 4 5 6 7 8 9 10
| (q 8 w 14 e -10 r 6 dtype: int64, q 54.598150 w 1096.633158 e 0.006738 r 20.085537 dtype: float64)
|
1
| 'q' in obj2, 'a' in obj2
|
运算时, 索引标签会自动对齐
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| (Ohio 35000 Texas 71000 Oregon 16000 Utah 5000 dtype: int64, California NaN Ohio 35000.0 Oregon 16000.0 Texas 71000.0 dtype: float64, California NaN Ohio 70000.0 Oregon 32000.0 Texas 142000.0 Utah NaN dtype: float64)
|
Series 本身及索引都有 name 属性
1 2 3
| obj4.name = 'population' obj4.index.name = 'state' obj4
|
1 2 3 4 5 6
| state California NaN Ohio 35000.0 Oregon 16000.0 Texas 71000.0 Name: population, dtype: float64
|
pandas 的数据结构 —— DataFrame
pd.DataFrame( object ) : DataFrame 的建立
1 2 3 4 5 6 7
| data = {'pop': [1.5, 1.7, 3.6, 2.4, 2.9, 3.2], 'state': ['Ohio', 'Ohio', 'Ohio', 'Nevada', 'Nevada', 'Nevada'], 'year': [2000, 2001, 2002, 2001, 2002, 2003] } frame = pd.DataFrame(data) frame
|
| pop | state | year |
---|
0 | 1.5 | Ohio | 2000 |
---|
1 | 1.7 | Ohio | 2001 |
---|
2 | 3.6 | Ohio | 2002 |
---|
3 | 2.4 | Nevada | 2001 |
---|
4 | 2.9 | Nevada | 2002 |
---|
5 | 3.2 | Nevada | 2003 |
---|
DataFrame.head( n ) : 对于特别大的 DataFrame,方法会选取前 n 行
| pop | state | year |
---|
0 | 1.5 | Ohio | 2000 |
---|
1 | 1.7 | Ohio | 2001 |
---|
2 | 3.6 | Ohio | 2002 |
---|
DataFrame.columns : 返回 DataFrame 的列名
Index(['pop', 'state', 'year'], dtype='object')
pd.DataFrame( object , columns ) : 指定列序列, DataFrame会按照指定顺序进行排列
1 2 3 4 5
| data = {'pop': [1.5, 1.7, 3.6, 2.4, 2.9, 3.2], 'state': ['Ohio', 'Ohio', 'Ohio', 'Nevada', 'Nevada', 'Nevada'], 'year': [2000, 2001, 2002, 2001, 2002, 2003] } pd.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 |
---|
5 | 2003 | Nevada | 3.2 |
---|
pd.DataFrame( object , columns , index ) : 指定索引
1 2 3
| frame2 = pd.DataFrame(data, columns=['year', 'state', 'pop', 'debt'], index=data['year']) frame2
|
| year | state | pop | debt |
---|
2000 | 2000 | Ohio | 1.5 | NaN |
---|
2001 | 2001 | Ohio | 1.7 | NaN |
---|
2002 | 2002 | Ohio | 3.6 | NaN |
---|
2001 | 2001 | Nevada | 2.4 | NaN |
---|
2002 | 2002 | Nevada | 2.9 | NaN |
---|
2003 | 2003 | Nevada | 3.2 | NaN |
---|
pd.DataFrame( dict ) : 嵌套字典 : { 'out1' : {'in1': v11, 'in2': v12}, 'out2': {...} }
如果嵌套字典传给DataFrame, 字典外层的键作为列, 内层的键则作为行索引
1 2
| pop = {'Nevada': {2001: 2.4, 2002: 2.9}, 'Ohio': {2000: 1.5, 2001: 1.7, 2002: 3.6}} pop
|
{'Nevada': {2001: 2.4, 2002: 2.9}, 'Ohio': {2000: 1.5, 2001: 1.7, 2002: 3.6}}
1 2
| frame3 = pd.DataFrame(pop) frame3
|
| Nevada | Ohio |
---|
2001 | 2.4 | 1.7 |
---|
2002 | 2.9 | 3.6 |
---|
2000 | NaN | 1.5 |
---|
pd.DataFrame( dict , index ) : 指定索引
1
| pd.DataFrame(pop, index=[2001, 2002, 2003])
|
| Nevada | Ohio |
---|
2001 | 2.4 | 1.7 |
---|
2002 | 2.9 | 3.6 |
---|
2003 | NaN | NaN |
---|
DataFrame 的索引和切片
1 2 3 4 5 6 7
| 2000 Ohio 2001 Ohio 2002 Ohio 2001 Nevada 2002 Nevada 2003 Nevada Name: state, dtype: object
|
1 2 3 4 5 6 7
| 2000 Ohio 2001 Ohio 2002 Ohio 2001 Nevada 2002 Nevada 2003 Nevada Name: state, dtype: object
|
| year | state | pop | debt |
---|
2002 | 2002 | Ohio | 3.6 | NaN |
---|
2002 | 2002 | Nevada | 2.9 | NaN |
---|
1
| frame2['state'].loc[2002]
|
1 2 3
| 2002 Ohio 2002 Nevada Name: state, dtype: object
|
DataFrame 的赋值
数组或列表 : 将列表或数组赋值给某个列时, 其长度必须跟 DataFrame 的长度相匹配
1 2
| frame2['debt'] = np.arange(6.) frame2
|
| year | state | pop | debt |
---|
2000 | 2000 | Ohio | 1.5 | 0.0 |
---|
2001 | 2001 | Ohio | 1.7 | 1.0 |
---|
2002 | 2002 | Ohio | 3.6 | 2.0 |
---|
2001 | 2001 | Nevada | 2.4 | 3.0 |
---|
2002 | 2002 | Nevada | 2.9 | 4.0 |
---|
2003 | 2003 | Nevada | 3.2 | 5.0 |
---|
Series : 如果赋值的是一个 Series , 就会精确匹配 DataFrame 的索引
1 2 3
| val = pd.Series([-1.2, -1.5, -1.7], index=[2000, 2001, 2004]) frame2['debt'] = val frame2
|
| year | state | pop | debt |
---|
2000 | 2000 | Ohio | 1.5 | -1.2 |
---|
2001 | 2001 | Ohio | 1.7 | -1.5 |
---|
2002 | 2002 | Ohio | 3.6 | NaN |
---|
2001 | 2001 | Nevada | 2.4 | -1.5 |
---|
2002 | 2002 | Nevada | 2.9 | NaN |
---|
2003 | 2003 | Nevada | 3.2 | NaN |
---|
1 2 3
| frame2['debt_null'] = pd.notnull(frame2.debt)
frame2
|
| year | state | pop | debt | debt_null |
---|
2000 | 2000 | Ohio | 1.5 | -1.2 | True |
---|
2001 | 2001 | Ohio | 1.7 | -1.5 | True |
---|
2002 | 2002 | Ohio | 3.6 | NaN | False |
---|
2001 | 2001 | Nevada | 2.4 | -1.5 | True |
---|
2002 | 2002 | Nevada | 2.9 | NaN | False |
---|
2003 | 2003 | Nevada | 3.2 | NaN | False |
---|
del : DataFrame 删除某列
1 2
| del frame2['debt_null'] frame2.columns
|
1
| Index(['year', 'state', 'pop', 'debt'], dtype='object')
|
DataFrame 的转置
| 2001 | 2002 | 2000 |
---|
Nevada | 2.4 | 2.9 | NaN |
---|
Ohio | 1.7 | 3.6 | 1.5 |
---|
可以输入给 DataFrame 进行构造的数据
二维 ndarray | 数据矩阵, 还可以传入行标和列标 |
由数组、列表和元组组成的字典 | 字典的每个键对应的序列会成为 DataFrame 的一列, 所有序列的长度必须相同 |
Numpy 的结构化 / 记录数组 | 类似于有数组组成的字典 |
由 Series 组成的字典 | 字典的每个键对应的 Series 会成为一列 |
由字典组成的字典 | 外层字典的键为列头, 内层字典的键为行索引 |
字典或 Series 列表 | 列表各项会成为 DataFrame 的各行, 各项字典/ Series 对应的键/索引会成为列头 |
由列表或元组组成的列表 | 类似于二维 ndarray |
另一个 DataFrame | 该 DataFrame 的索引将被沿用 |
Numpy 的 MaskedArray | 类似于二维 ndarray, 掩码值在 DataFrame 会变成NA/缺失值 |
DataFrame 的 name 和 values 属性
如果设置了 DataFrame 的 index 和 columns 的 name 属性, 则这些信息也会被显示出来
1 2
| frame3.index.name = 'year'; frame3.columns.name = 'state' frame3
|
state | Nevada | Ohio |
---|
year | | |
---|
2001 | 2.4 | 1.7 |
---|
2002 | 2.9 | 3.6 |
---|
2000 | NaN | 1.5 |
---|
values 属性也会以二维 ndarray 的形式返回 DataFrame 中的数据
1 2 3
| array([[2.4, 1.7], [2.9, 3.6], [nan, 1.5]])
|
1 2 3 4 5 6
| array([[2000, 'Ohio', 1.5, -1.2], [2001, 'Ohio', 1.7, -1.5], [2002, 'Ohio', 3.6, nan], [2001, 'Nevada', 2.4, -1.5], [2002, 'Nevada', 2.9, nan], [2003, 'Nevada', 3.2, nan]], dtype=object)
|