python pandas使用简介

GitHub链接:https://github.com/lianggx6/Tools/wiki/Python-pandas-notebook

pandas 简介

  • Python pandas是基于Numpy的一种工具。Python的数据结构可大致分如下几种:

    1. Series:一位数组,与Numpy中的一维array类似。二者与Python基本的数据结构List也很相近。
    2. DataFrame:二维的表格型数据结构,可以将DataFrame理解为Series的容器。pandas中最为常用的结构。
    3. Panel :三维的数组,可以理解为DataFrame的容器。
  • pandas的安装:pip install pandas

Series结构的使用

  1. Series的构造和初始化
    • Series构造有(1)使用列表构造,(2)使用字典构造,(3)使用numpy array构造。Series是key-value结构,其index默认为0-n,也可以用我们指定index或者k值。即便指定了index,使用0-n仍然可以对其数据进行访问。
    • Series的构造函数中有以下几个参数:data代表要初始化的数据;index代表要指定的下标;name指定该series的名称,dtype可指定数据类型,但查了许久不知其正确的赋值方式。
    • 如下为Series构造及初始化的几个简单例子,不代表全部。
# 使用list构造Series
import pandas as pd
mylist = [1000, 2000, 3000, 4000] 
s = pd.Series(mylist, index=['A', 'B', 'C', 'D'], name='income') # 指定index和name,也可不指定
print(s)  
# 
# 使用字典构建Series,字典的键值默认作为Series的index
mydict = {'A': 1000, 'B': 2000, 'C': 3000, 'D': 4000}
s = pd.Series(mydict)
print(s)
#
# 使用numpy数组构建Series
import numpy as np
mylist = [1000, 2000, 3000, 4000]
myarray = np.array(mylist)
s = pd.Series(myarray)
print(s)
  1. Series的数据选择
    • Series的数据选择有如下几种方式:(1)使用位置下标或标签下标选择(2)使用位置切片或标签切片进行选择(3)使用布尔值索引进行选择。
mydict = {'A': 1000, 'B': 2000, 'C': 3000, 'D': 4000}
s = pd.Series(mydict)
# 使用位置下标或标签下标进行选择
s1 = s[0]  # 选择1000, type为int
s2 = s['B']  # 选择2000, type为int
s3 = s[[1, 3]] # 选择第2、4个数据, type为一个Series
s4 = s[['A', 'C']]  # 选择第1、3个数据, type为一个Series
#
# 使用位置切片或标签切片选择数据
s5 = s[1:3]  # 选择第2-3个数据,type为一个Series
s6 = s[::-1]  # 倒序选择数据,type为一个Series
s7 = s['A':'C'] # 选择标签A-C之间的数据(包括两端)
# 使用0-n切片时,是不包括后端的,使用标签是前后两端都包括
#
# 使用布尔索引选择数据
s8 = s[s > 3000] # 选择s中大于3000的数据
#这种写法pycharm会报警告s为Series,不能和int比较
  1. Series的插入与删除
    • Series使用drop()和pop()方法删除数据,两者的不同在于drop()方法返回一个删除后的副本,而pop()方法之间在源数据中删除。使用append()的方法增加数据。
mydict = {'A': 1000, 'B': 2000, 'C': 3000, 'D': 4000}
s = pd.Series(mydict)
# Series的删除
s1 = s.drop('A')  # 返回删除键为A的副本,s不变
s2 = s.drop(['A', 'B'])  # 参数也可以是键值列表
s.pop('A')  # 删除键值为A的数据,s改变,参数只能是一个键值,不能是列表
#
# Series的插入
mydict2 = {'F': 6000, 'G': 7000}
s2 = pd.Series(mydict2)
s['E'] = 5000  # 可直接增加新的键值
s3 = s.append(s2)  # 使用append可在后边接上一个series并返回副本
  1. Series的数据缺失
    • Series中对于数据的缺失,使用NaN代替。NaN与None不同,本质是一个无法表示的float类型,NaN参与的运算结果均为NaN。
    • Series中可使用notnull()方法判断值是否不为NaN,也可以使用isnull()方法判断值是否为空,还可以使用这两个方法选取缺失或为缺失的数据。
mydict = {'A': 1000, 'B': 2000, 'C': None, 'D': 4000}
s = pd.Series(mydict)  # s[2]或s['C']中的值即为NaN
s1 = s.isnull()  
# 该方法返回一个bool型series,对应键值不存在则为true,反之false
s2 = s.notnull()
# 该方法返回一个与上边的值对应相反的series
s3 = s[s.isnull()]
# 该方法可选取所有值不存在的数据并返回一个series,可通知对其赋值修改无效值
s4 = s[s.notnull()]
# 该方法可选取所有值存在的数据并返回一个series
# 通过以上s3和s4,可以发现使用对应的bool类型的series也可以对series选取数据
s5 = s.fillna(0)
# 该方法将不存在的数据填充为0,并返回一个series
  1. Series的数据运算
    • Series的数据运算功能比较强大且方法较多,这里只列举一些博客中遇到的。需要使用时可以搜博客或翻技术文档,之后有用到也会及时补充到这里。
import pandas as pd
import numpy as np
mydict = {'A': 1, 'B': 2, 'C': None, 'D': 4}
mydict2 = {'A': 10, 'F': 20}
s = pd.Series(mydict)
n = pd.Series(mydict2)
s1 = s/2  # Series支持+ - * / 的标量运算
s2 = s + n  # 支持对两个Series的 + - * / 的运算, 索引自动对齐
# 其中对应键值进行运算,无对应键值或键值为NaN的结果均以NaN处理
s3 = s**2  # Series支持乘方运算
s4 = s.mean()  # Series可使用函数进行均值,最大值(max)、最小值(min)计算
# 由于Series和numpy的形式很像,故可很多numpy的计算函数series也可使用
s5 = np.log(s)  # log运算
s6 = np.exp(s)  # e的n次方,除此还有sqrt()开方、pow()乘幂运算等
# 一些排序函数,NaN无论升序降序均排最后
s7 = s.sort_values()  # 按值排序,参数ascending默认升序
s8 = s.sort_indexs()  # 按索引排序, 参数ascending默认升序  

DataFrame结构的使用

  1. DataFrame的构造和初始化
    • DataFrame是一种表格式的结构,将Series的结构从一维拓展到二维,既有行索引也有列索引。DataFrame的创建也可分为(1)使用列表创建(2)使用字典创建(3)使用numpy数组创建等几类。但DataFrame作为一个二维结构,以上几种方式又可以组合使用,如字典里包列表、列表里包列表、列表里包字典等等,还可以使用Series,下方只是简单举例。
    • DataFrame的构造函数中有几个参数。data代表要构造的数据,index代表行索引,columns代表列索引,dtype可以指定值类型。
import pandas as pd
import numpy as np
#
# 使用列表创建DateFrame
mylist = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
d = pd.DataFrame(mylist, index=['x', 'y', 'z'])
#
# 使用字典创建DataFrame,键值作为列索引
mydict = {
    'a': [1, 2, 3, 4],
    'b': [5, 6, 7, 8],
    'c': [9, 10, 11, 12],
    'd': [13, 14, 15, 16]
}
d = pd.DataFrame(mydict)
#
#使用如下方式,外层字典的键作为列索引,内层字典键作为行索引
mydict = {
    'Smith': {'age': 10, 'sex': '男'},
    'Obama': {'age': 10, 'sex': '男'},
    'Trump': {'age': 10, 'sex': '男'},
}
d = pd.DataFrame(mydict)
#
# 使用numpy数组创建DataFrame
d = pd.DataFrame(np.random.rand(3, 4))
  1. DataFrame的数据选取
    • DataFrame的数据选取大概有以下几种方式。(1)通过属性名(列索引columns)对列进行选取(2)通过运算符[]选取列或进行切片(3)通过loc[]方法使用标签对行列进行选取(4)通过iloc[]方法使用位置对行列进行选取(5)通过运算符[]进行条件选取。
import pandas as pd
mylist = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
mydict = {
    'a': [1, 2, 3, 4],
    'b': [5, 6, 7, 8],
    'c': [9, 10, 11, 12],
    'd': [13, 14, 15, 16]
}
d = pd.DataFrame(mydict, index=['w', 'x', 'y', 'z'])
#
# 通过属性进行选取
d1 = d.c  # 可以直接通过属性选取DataFrame的一列
# 该方法限制较多,一是不能选到行,二是以数字或其他非法字符开头的列标签不能选取
#
#通过运算符[]进行选取
d2 = d['c']  # 直接按列名进行选取一列,列名必须存在
d3 = d['y':]  # 使用按标签切片的方式,选取的是行
d4 = d[2:]  # 也可以直接使用数字切片,也是选取的行
#
#使用.loc[]方法使用标签进行选取
d5 = d.loc['y']  # 该方法可以直接选取到行,返回一个series
d6 = d.loc['y':]  # 该方法也可以使用切片
d7 = d.loc['z', 'a']  # 该方法也可以同时接受行列两个参数进行选取
d8 = d.loc['y':, 'a':'c']  # 这两个参数还可以同时使用切片
# 注意!两个参数时顺序为先行后列!!!
#
#通过.iloc[]方法使用位置进行选取,该方法与上述基本一样,只是将标签换为位置
d9 = d.iloc[2]  # 直接选取到行,返回一个series
d10 = d.iloc[2:]  # 使用切片
d11 = d.iloc[2, 2]  # 两个参数分别代表行和列
d12 = d.iloc[2:, 0:2]  # 两个参数的切片
# 使用位置切片和使用标签切片有所不同,位置切片不包括后端,标签切片两端都包括
#
# 通过条件筛选选取数据
d13 = d[d['c'] > 10]  # 以某一列作为条件筛选行
d14 = d.loc[:, d.loc['y'] > 10]  # 以某一行作为条件筛选列,注意与上式的不同
d15 = d.loc[d['c'] > 10, d.loc['y'] > 10]  # 将行和列作为筛选条件组合起来
d16 = d.loc[(d['a'] > 3) & (d['c'] > 10)]  # 将条件通过& |进行组合
* DataFrame数据选取简单总结: 
(1)不要总将DataFrame作为二维数组看待,因为标签索引优先于位置索引。 
(2)简单讲,选列时用d[col],选行时用d.loc[row]。  
(3)使用位置定位直接使用d.iloc[x,y]。  
  1. DataFrame的删除和增加

猜你喜欢

转载自blog.csdn.net/lianggx6/article/details/87916996