5.《Python数据分析》pandas入门

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内使用lociloc进行索引操作

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使用applymap实现对每个元素的函数应用
  • 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返回两数组匹配后的索引对齐情况

往年同期文章