pandas是后续数据清理和分析的重要工具
pandas是基于numpy构建的,但支持异构的数据(不同于numpy,pandas中不同列的类型可以是多样化的,比如日期、数值、字符串等)。pandas的功能定位可以对标Excel,但相比于Excel会更加地灵活强大
1 pandas数据结构介绍
pandas包含两个主要数据结构:Series和DataFrame
Series是一种类似于一维数组的对象,包含了列表、字典或一维numpy数组的很多特性;每个Series都是由一个名称(name)、一组index和一组values构成;Series内的元素类型应该是相同的
DataFrame则是以二维结构来存储数据,多个Series则构成了一个DataFrame,每个Series对应一列,Series的名称对应列名,Series内的索引对应行索引;不同Series间的类型可以是不同的,但不同Series会共享一套索引
Series操作示例:
import pandas as pd
from pandas import Series, DataFrame
obj = pd.Series([4, 7, -5, 3], index=['d', 'b', 'a', 'c'])
obj.index # 查看Series的索引
obj.values # 查看Series的值
obj.name='exam' # Series的名称赋值
obj[['c', 'a', 'd']] # 行筛选
obj[obj2> 0] # 逻辑筛选
pd.Series({'Ohio': 35000, 'Texas': 71000}) # 字典转换为Series
obj.to_dict() # Series转换为字典
pd.isnull(obj) # 对每个元素进行缺失判断
Series的索引非常灵活,默认是整数,也可以是其他格式(字符串、日期)
DataFrame操作示例:
data = {'state': ['Ohio', 'Ohio', 'Ohio', 'Nevada', 'Nevada', 'Nevada'],
'year': [2000, 2001, 2002, 2001, 2002, 2003],
'pop': [1.5, 1.7, 3.6, 2.4, 2.9, 3.2]}
frame = pd.DataFrame(data)
frame.head() # 查看前五行
frame.tail(3) # 查看后三行
frame['state'] # 筛选列,等价于frame.state
del frame['pop'] # 删除一列
frame.columns # 查看列名
frame.index # 查看行索引
frame.values # 查看数据(返回二维数组结构)
frame.loc[1,'year'] # 筛选,行索引=1,列名=year
frame.iloc[1,2] # 筛选,第2行第3列
frame.T # 行列转置
"Ohio" in frame.columns # 判断是否存在名为Ohio的列
203 in frame.index # 判断是否存在名为203的索引
pandas的筛选一般也是视图操作,不会复制数据(节省内存),
copy()
可主动复制数据行索引应该具备唯一性,确定后会转换为不可变对象(安全)在不同Series间共享
类似于一维数组,行索引也可以进行很多操作,比如
append
拼接、intersection/union/difference/
交并补、delete/drop
删除、insert
添加、unique
去重、is_unique
是否没有重复值、is_monotonic
是否递增
2 基本功能
常用基本方法
reindex
指定新的行索引或新的列名/列索引(axis=0
指定行,axis=1
指定列)drop
弃置行列(也可以是某几行或某几列,axis=0
指定行,axis=1
指定列)- 使用切片(如
df[2:4]
)和逻辑运算(如df[df < 5]
)进行更复杂的赋值/筛选/过滤 - 用
loc
(输入为行索引和列名/列索引)和iloc
(输入为行数和列数)进行更精细化的筛选 - 索引对齐,两个DataFrame相加/减时,会自动根据索引(包括行索引和列名/列索引)进行对齐然后再加/减;这种操作可能(索引无法对齐的时)会导致结果存在缺失,可考虑借助参数
fill_value
填充缺失 - DataFrame和Series之间的算术运算也会支持广播机制(参数
axis
指定按行或列广播) - 使用
sort_inedx
按照索引(也支持列名/列索引)排序,使用sort_values
按照值排序(对于DataFrame可指定是哪一列的值);参数ascending
控制是否为升序;参数na_position
控制缺失值的位置 - 使用
rank
返回排序结果的次序(不会打乱原始数据),可指定多种次序的确定方法
Python内置的整数索引和panda存在冲突,因此推荐在pandas内使用
loc
和iloc
进行索引操作pandas的索引并不强制要求唯一性,但重复索引会为数据清洗和分析带来不必要的麻烦
注意尽量避免存在链式索引的写法:
data.loc[data.three == 5]["three"] = 6 # 链式索引
# 此时程序会警告:SettingWithCopyWarning
# 提示你正在一个尝试修改一个临时值,原始数据不会被修改
data.loc[data.three == 5, "three"] = 6 # 正确写法
Numpy中的通用函数(ufuncs)也同样适用于操作pandas对象:
frame = pd.DataFrame(np.random.randn(4, 3), columns=list('bde'),
index=['Utah', 'Ohio', 'Texas', 'Oregon'])
np.abs(frame) # 使用ufuncs计算绝对值
frame.apply(lambda x: x.max() - x.min(), aixs=1) # 每列最大值-最小值,返回Series
frame["Ohio"].map(lambda x: x:.2f) # 返回输出格式调整后的Ohio列(Series)
frame.applymap(lambda x: x:.2f) # 返回输出格式调整后的ataFrame
- DataFrame使用
apply
实现对行或列的函数应用 - Series使用
apply
或map
实现对每个元素的函数应用 - DataFrame使用
applymap
实现对每个元素的函数应用
3 绘制和描述统计
numpy的很多聚合计算也继承到了DataFrame中:
df.sum(skipna=False) # 按列求和
df.sum(axis=1) # 按行求和
df.mean(axis='columns', skipna=False) # 按行求和,忽略缺失值
df.idxmax() # 按列计算最大值对应的行索引
df.argmin() # 按列计算最小值对应的行索引位置(整数)
df.cumsum() # 按列计算累加
df.describe() # 直接返回多种统计值的汇总
其他DataFrame常用的聚合函数:count
计数、quantile
分位数、mad
平均绝对偏差、prod
所有值的乘积、skew
偏度、kurt
峰值、cumpord
累加乘、cummin, cummax
累加最小/大值、diff
差分、pct_change
百分比变化
其他描述统计常用函数:corr
相关系数、cov
协方差、corrwith
批量计算Series与DataFrame间的相关系数、unique
唯一值、value_counts
按照值统计词频、isin
是否包含、match
返回两数组匹配后的索引对齐情况