pandas数据处理#数据科学手册笔记

743 阅读4分钟

数据取值与选择

Series数据选择方法

类比一维np数组和py字典

  1. 看作字典
import pandas as pd
data = pd.Series([0.25,0.5,0.75,1],index=['a','b','c','d'])
#或者data = pd.Series({'key1':value1,'key2':value2...})

data['b']#显式索引

'a' in data #类比字典表达式,检测键/索引和值

data.keys() #类比字典,输出键

list(data.items()) #类比输出字典

data['e'] = 1.25 # 新增键扩展字典,增加新的索引值扩展

# Series可变,Pandas 在底层已经为可能发生的内存布局和 数据复制自动决策

  1. 看作一维数组
data['a':'c'] # 显式索引作为切片,闭区间

data[0:2] #隐式索引作为切片,左闭右开

data[(data > 0.3) & (data < 0.8)] #掩码

  1. 索引器:loc iloc ix
# loc表示取值和切片都是显式的
data.loc[1]
data.loc[1:3]
out:1  a
    3  b

# iloc表示取值和切片都是puthon形式(从0开始,左闭右开区间)的隐式索引
data.iloc[1]
data.iloc[1:3]
out:3  b
    5  c
    
# ix:标准的python列表取值方式(主要用于DataFrame对象

DataFrame数据选择方法

  1. 看作字典
area = pd.Series({'California':423967,'Texas':695662,'New York':141297,'Florida':170312,'Illinois':149995})
pop = pd.Series({'California':38332521,'Texas':26448193,'New York':19651127,'Florida':19552860,'Illinois':12882135})

data = pd.DataFrame({'area':area,'pop':pop})

#获取DataFrame的列
data.area   #属性形式
#列名不是纯字符串或者列名与DataFrame方法同名时,不能用属性索引
data['area'] #字典形式,注意引号

#使用字典语法增加列
data['density'] = data['pop'] / data['area']

2. 看作二维数组

#输出值,按行查看数组数据
data.values

# 转置DataFrame多维数组
data.T

转置多维数组

3. 索引器 与Series相同,用于处理np形式数据的方法都可用于索引器 4. 查看数据及属性

data.dtypes  #查看各列数据类型

data.head(n)    #查看前n行数据,不输入参数时默认前5行
data.tail(n)
#查看后n行数据,不输入参数时默认后5行

data.index  #查看行索引
data.columns  #查看列索引
data.values #查看所有数值

data.describe() #查看描述性统计,包括count mean min max std 25% 50% 75%

#重置数据
#使用iloc索引器可以像操作数组操作DataFrame
#获取1-3行得0、2列数据,其中[0,2]部分参数不能使用切片
data.iloc[0:3,[0,2]]
data.iloc[0,0] = 1  #所选位置替换为1

pandas数值运算方法

  1. pandas对象使用numpy通用函数,结果为保留索引得pandas对象
  2. 通用函数:索引对齐(通过python内置的集合运算规则实现,任何缺失值默认都用NaN填充)

DataFrame索引对齐

rng = np.random.RandomState(42)

A = pd.DataFrame(rng.randint(0,10,(2,2)),list='AB')
#输出2x2矩阵
B = pd.DataFrame(rng.randint(0,10,(3,3)),list='BCA')
#输出3x3矩阵

A+B
#输出结果的索引会自动排序,缺失值默认用NaN填充

fill = A.stack().mean()
A.add(B,fill_value=fill)
#用A中所有值的均值填充缺失值
#计算均值需要用stack将二维数组压缩成一维数组

py运算符与pd方法映射关系

运算

A = rng.randint(10,size=(3,4))

df = pd.DataFrame(A,columns=list'QPST')
df - df.iloc[0]
#默认按行计算

df.subtract(df['R'],axis=0)
#通过axis参数指定按列计算

处理缺失值

  • 主要形式 null NaN NA
  • 方法
    • 通过一个覆盖全局的掩码表示缺失值
    • 用一个标签值(sentinel value)表 示缺失值
  1. None
    • None是py单体对象,只能用于py对象构成的数组('object'数组类型
    • py中没有定义整数与None之间的算数运算
  2. NaN
    • 种按照 IEEE 浮点 数标准设计、在任何系统中都兼容的特殊浮点数
    • Nan会和所接触过的数据同化:无论和NaN进行何种操作,最终结果都是NaN
    • nansum() nanmin()函数可以忽略缺失值的影响
  3. pandans把NaN和None看成是等价交换,自动将None转换为NaN;将没有标签值得数据类型自动转换成浮点数缺失值NA
  4. pandas对不同类型缺失值得转换规则

处理缺失值

  • 发现缺失值
    • data.isnull()#创建布尔类型掩码标签数组
    • data.notnull()
    • data[data.notnull()]#布尔类型掩码数组可以直接作为Series或DataFrame索引使用
  • 剔除缺失值
    • data.dropna()#Series中可以直接使用,DataFrame中无法单独剔除一个值,只能剔除缺失值所在的整行或者整列(没有指定时默认剔除行)
    • 参数axis指定剔除行/列
    • 参数how设置剔除行或者列缺失值的数量阈值
    • 参数thresh设置行或列中非缺失值的最小数量
  • 替换缺失值
    • data.fillna(0) #用0填充缺失值
    • mathod指定填充方式
      • data.fillna(method='ffill')#前面没有值时,填充后依然为空
      • data.fillna(method='bfill')#后面没有值时,填充后依然为空