python库基础--pandas

pandas入门

pandas提供了高级数据库和函数,使利用结构化,表格化数据的工作快速,简单,有表现力

导入:import pandas as pd

pandas数据结构介绍

Series和DataFrame

Series:

一种一维数组型对象,包含了一个值序列和一个数据标签,称为索引,最简单的一个序列可以仅有一个数组组成

obj = pd.Series([4,7,-2,1])
0  4
1  7
2  -2
3  1
dtype: int64

左边为索引,右边为值,若不指定索引,默认为0-N-1

属性:
    obj.value  # 获得值  array格式
    obj.index  # 获得索引 

创建一个索引序列:
    obj = pd.Series([1,2,3],index = ['a','b','c']) # 很像字典

取值: obj['a'],obj[['a','b','c']]

可以使用Numpy的函数或者风格进行操作,如:
布尔索引:obj[obj>2]
数学运算:obj*2
Numpy函数: np.exp(obj)

在另一个角度去看Series,可以认为它是一个长度固定的且有序(python中字典无序)的字典

可以使用字典来生成一个Series
    dic_data = {'a':11,'b':22}
    obj = pd.Series(dic_data)

    可以输入一个索引数组来为字典位置进行匹配
    obj = pd.Series(dic_data,index = ['b','a'])

    若索引数组中出现了字典中不存在的key,则它对应的值则为NaN

pandas中可以使用:
    pd.isnull(obj)
    pd.notnull(obj) 来检测数据的缺失


Series的自动对其特性:
    obj1 + obj2 
    会寻找索引相同的进行操作
    若不存在对应的索引,则会给出一个NaN值


Series和其索引都有name属性,这个属性与pandas其他功能有紧密的联系
    obj.name = 'aaa'
    obj.index.name = 'aaa_index'  对其进行赋值


Series可以通过对索引赋值索引数组来对索引进行改变
    obj.index = ['name1','name2']


DataFrame

DataFrame 是表示矩阵的数据表,它包含已排序的列集合,他的每一列可以是不同的值类型(整数,浮点,字符串),
DataFrame既有列索引也有行索引,可以视为一个共享相同索引的Series字典,在DataFrame中,数据被存储在一个以上的二维块中,
而非是列表,字典,或者其他一维数组的集合。

构建一个DataFrame数组:
    利用等长度的Numpy数组或者列表构建
    data = {'name':['a','b','c'],'age':[18,17,21]}
    frame = pd.DataFrame(data)

    names = np.array(['a','b','c'])
    age = np.array([18,17,21])
    data = {'name':names,'age':age}
    frame = pd.DataFrame(data)

    DataFrame会自动分配索引 0 - N-1
    
    frame.head()  # 拿到前五行


    嵌套字典生成DataFrame:
        obj = {'names':{1:'cc',2:'jj'},'age':{1:18,2:19}}
        pd.DataFrame(obj)
        
        外层key会被作为列索引 里层key会被作为行索引


    含有Series的字典生成DataFrame:
          name  age    old
        0    a   18  False
        1    b   17  False
        2    c   21   True

        pdata = pd.DataFrame({name:frame['name'],'age':frame['age']})
          name  age
        0    a   18
        1    b   17
        2    c   21

指定列顺序:
    pd.DataFrame(data,columns=['name','age'])
    若传入的名称列表并不是字典的key,则会出现缺失现象
指行定索引值:
    pd.DataFrame(data,index=['a','b','c'])


DataFrame取值:
    1.取列
        frame['key']  # 通过字典一样的key
        frame.key  # 像查找属性一样
        
        返还的是一个Series数组 name为其key
        列的值可以通过赋值来修改
        frame['key'] = 1
    
        当将列表或者数组赋值给一个列时,长度必须要相匹配
        若被赋值的列不存在,则将会生成一个新的列
        frame['old'] = frame['age'] >= 21
        frame.old 则不可以生成新的列

        对于不使用的列可以使用del来进行删除 ,就像python中对字典删除key一样

        在DataFrame中选取的Series数组的修改会直接影响到DataFrame数组


    2.取行
        frame.loc[0]


DataFrame的name
    frame.columns.name = ''  # 行名的name
    frame.index.name = ''  # 索引的name
    
    frame.values  # 可以返还全部的值 array格式


索引对象

pandas中的索引对象是用来存储轴标签和其他元数据的

obj = pd.Series(range(3),index = ['a','b','c'])
index = obj.index

索引对象是不可以改变的
    pd.index() 转为索引对象
索引对象的一些方法
    append() 将原索引添加新的索引,产生新对象
    difference() 计算两索引的差集
    intersection() 交集
    union() 并集
    delete() 删除位置i 产生新序列
    drop() 删除索引值() 产生新序列
    insert() 在位置i插入 产生新序列


基本功能

重建索引

obj = pd.Series([1,2,3,4],index = ['a','b','c','d'])
obj.reindex(['aa','bb','cc','dd','ee'])
aa   NaN
bb   NaN
cc   NaN
dd   NaN
ee   NaN
dtype: float64
会根据新索引来进行排序,但是若索引值不存在则会添加NaN


obj = pd.DataFrame({'name':['cc','jj','ee'],'age':[19,20,20]})
obj.reindex([1,2,0])
obj.reindex(columns = ['age','name'])
或者:
obj.loc[[1,2,0],['age','name']]

轴向上删除条目

obj = pd.DataFrame({'name':['cc','jj','ee'],'age':[19,20,20]})
new_obj = obj.drop(0)
  name  age
1   jj   20
2   ee   20

new_obj = obj.drop([0,1])

删除列:
    new_obj = obj.drop(['name'],axis = 1)
    new_obj = obj.drop(['name'],axis = 'columns')

修改原对象:
    obj.drop(1,inplace=True)

索引,选择,过滤

Series索引和numpy类似
但是Series的索引不仅仅是只有数组,还可以有字母
obj['a']
obj[0]
obj[2:4] # 这种切片还是有头无尾
obj[[0,1]]
obj[obj<3]

obj['a':'b'] # 这种有头有尾


DataFrame
obj['name']  # 单个索引选择的是列
obj[:2]  # 特殊情况,选择的是行,且有尾
obj[obj['name']=='cc']  # 布尔索引,选择的是行
obj.loc[0]['name','age']


obj.iloc[0][[0,1]] # 以整数索引方式拿值

计算

索引相同的会进行操作,不存在对应的则会返回NaN
使用内置方法计算:
    df1.add(df2,fill_value=0)
    对不上的一个使用0代替
    sub 减法
    div 除法
    floordiv 整除
    mul 乘法
    pow 幂次方

DataFrame 和 Series的算数会用到广播机制


描述性统计的概述和计算

pandas1对象装配了一个常用的数学,统计学方法的集合

df.sum() # 求列和,返还一个Series对象
df.sum(axis = 'columns') 返还行和
.count()  计算非NA值个数
.describe() 计算各列汇总统计集合
min,max最大最小值
argmin,argmax 索引位置
idxmin,idxmax 索引标签

mean 均值
median 中位数
mad 平均值的平均绝对偏差
prod 所有值的积
var 方差
std 标准差
diff 计算第一个算数差值
pct_change 计算出当前元素和其上一个元素的值相差的百分比


Series中
    obj['aa'].corr(obj['bb']) 计算aa和bb中非NA的,按索引对齐的值的相关性
    obj['aa'].cov(obj['bb']) 计算协方差

DataFrame中:
    obj.corr() 以矩阵的形式返还其相关性
    obj.cov() 以矩阵形式返回协方差



唯一值和成员:
    obj.unique() 给出一个array,里面是仅出现一次的值
    obj.value_counts() 给出一个Series 里面有每个值出现的个数
    
    obj.isin(['a','b']) 返还一个Series,值为bool类型,若在列表内,为True否则为False

    obj[obj.isin['a','b']] 可以拿到一个在列表内元素组成的Series
posted @ 2022-01-27 15:09  cc学习之路  阅读(113)  评论(0)    收藏  举报