Pandas
pandas介绍
pandas 是基于NumPy 的一种工具,提供了大量能使我们快速便捷地处理数据的函数和方法。它是使Python成为强大而高效的数据分析环境的重要因素之一。我们知道numpy能够帮助我们处理数值型数据,但是这还不够,除数值型数据以外,我们还有能够处理字符串数据、时间序列等数据。所以,pandas的除了能处理数值型数据,还可以帮助我们处理其他类型的数据。(字符串、时间序列等数据)
Pandas的常用数据类型
1. Series 一维(带标签数组)
2. DataFrame 二维 (Series容器)
一、Series的创建
Series对象本质上由两个数组构成(键:值):一个数组构成对象的键(index(索引)),另一个是值(values)
1.通常的创建方式
import pandas as pd a = pd.Series([1,2,3,4],index=list("abcd")) #创建序列 index为指定索引的值 默认:0,1,2.... print(a) """ 输出结果 a 1 b 2 c 3 d 4 dtype: int64 """
2.字典方式创建
import pandas as pd dict = {"name":"zhangsan","age":12,"tel":100} data = pd.Series(dict) print(data) print(type(data)) #输出data的数据类型为Series """ 运行结果: name zhangsan age 12 tel 100 dtype: object <class ‘pandas.core.series.Series‘> """
也可以用data.dtye查看数据类型,如果要修改数据类型,则data.astype(float)
Series取值
import pandas as pddict = {"name":"zhangsan","age":12,"tel":100}data = pd.Series(dict)print("键取值:")print(data[‘age‘],data[‘tel‘]) #通过键取值print("位置取值:")print(data[0],data[1]) #通过位置取值print("前两行:")print(data[:2]) #取前两行print("不连续的:")print(data[[0,2]]) #取不连续的 或者data[["name","tel"]]"""运行结果:键取值:12 100位置取值:zhangsan 12前两行:name zhangsanage 12dtype: object不连续的:name zhangsantel 100dtype: object"""
data[data>55] 选出大于55的值。切片:data[0:2:1]
其他操作
import pandas as pd dict = {"name":"zhangsan","age":12,"tel":100} data = pd.Series(dict) print(data.index) #取索引 print(data.values) #取值 """ 运行结果: Index([‘name‘, ‘age‘, ‘tel‘], dtype=‘object‘) [‘zhangsan‘ 12 100] """
二、pandas读取外部数据
import pandas as pd #读取csv中的文件 # df = pd.read_csv("文件路径") #如:pd.read_csv("data_file//data.csv") #读取mysql中的数据 # import pymysql # conn = pymysql.connect(host=‘localhost‘, user=‘root‘, passwd=‘root‘, db=‘anjuke‘) # sql_sentence = "select * from lp_home" # df = pd.read_sql(sql_sentence,conn) #读取MongoDB中的数据 # from pymongo import MongoClient # client = MongoClient() # collection = client["数据库名"]["表名"] # data = list(collection.find())
三、DataFrame
DataFrame对象既有行索引,又有列索引
行索引:表名不同行,横向索引(index),0轴,axis=0
列索引:表名不同列,纵向索引(columns),1轴,axis=1
1.通常创建方式:
import pandas as pd import numpy as np #index:行索引 columns:列索引 reshape:改变数组格式(三行四列) pf = pd.DataFrame(np.arange(12).reshape(3,4),index=list("abc"),columns=list("wxyz")) print(pf) """ 运行结果: w x y z a 0 1 2 3 b 4 5 6 7 c 8 9 10 11 """
2.字典方式创建:
import pandas as pd import numpy as np dict = {"name":["张三","李四"],"age":[12,20],"tel":[100,101]} pf = pd.DataFrame(dict) print(pf) dict1 = [{"name":"张三","age":12,"tel":100},{"name":"李四","age":20,"tel":101}] pf1 = pd.DataFrame(dict1) print(pf1) """ 运行结果: name age tel 0 张三 12 100 1 李四 20 101 name age tel 0 张三 12 100 1 李四 20 101 """
两种方式都是一样的结果
3.DataFrame的基础属性
df.shape #行数 列数
df.dtpyes #列数据类型
df.ndim #数据维度
df.index #行索引
df.columns #列索引
df.values #对象值,二维ndarray数组
import pandas as pd import numpy as np dict = {"name":["张三","李四"],"age":[12,20],"tel":[100,101]} pf = pd.DataFrame(dict) #pf.index 行索引 print(pf.index) #pf.columns 列索引 print(pf.columns) #pf.values 对象值 print(pf.values) #pf.shape 行数、列数 print(pf.shape) #pf.dtypes 列数据类型 print(pf.dtypes) """ 运行结果: RangeIndex(start=0, stop=2, step=1) Index([‘name‘, ‘age‘, ‘tel‘], dtype=‘object‘) [[‘张三‘ 12 100] [‘李四‘ 20 101]] (2, 3) name object age int64 tel int64 dtype: object """
4.DataFrame整体情况查询
df.head(3) #显示头部3行,默认5行
df.tail(3) #显示末尾3行,默认5行
df.info() #相关信息概述:行数、列数、列索引、列非空值个数、列类型、内存占用 可以用来判断缺失值
df.describe() #快速综合统计结果:计数,均值,标准差,最大值,四分位数,最小值
5.排序
import pandas as pd import numpy as np dict = {"name":["张三","李四"],"age":[12,20],"tel":[100,101]} pf = pd.DataFrame(dict)#按照某列排序 sort = pf.sort_values(by="age",ascending=False) #by:按哪个属性进行排序 ascending=False 降序排序 ascending默认为True 升序 print(sort) """ 运行结果: name age tel 1 李四 20 101 0 张三 12 100 """
6.切片
df[:20] 取前20行
df[‘age‘] 取age列
df[:20][‘age‘] 取age列的前20行
注意:
*方括号写数组,表示取行,对行进行操作
*方括号写字符串,表示取列,对列进行操作
7.loc选择方式
df.loc通过标签索引行数据
df.iloc通过位置获取行数据
import pandas as pd import numpy as np pf = pd.DataFrame(np.arange(12).reshape(3,4),index=list("abc"),columns=list("wxyz"))pf.loc[:,"w"] #取w列pf.loc["a",:] #取a行#选取索引b行w z的值 print(pf.loc["b",["w","x"]]) #选取多行多列的值 print(pf.loc[["a","b"],["w","x"]]) #选取连续行多列的值 print(pf.loc["a":"c",["w","x"]]) """ 运行结果: w 4 x 5 Name: b, dtype: int32 w x a 0 1 b 4 5 w x a 0 1 b 4 5 c 8 9 """
import pandas as pd import numpy as np pf = pd.DataFrame(np.arange(12).reshape(3,4),index=list("abc"),columns=list("wxyz")) # #选取索引b行w z的值 pf.iloc[1,:] #取第2行 pf.iloc[:,2] #取第3列 pf.iloc[[1,2],[0,1]] #取2,3行的1,2列 pf.icol[1:,:2] pf.iloc[[1,2],[0,1]] = 100 #可赋值操作
取值条件
import pandas as pd import numpy as np pf = pd.DataFrame(np.arange(12).reshape(3,4),index=list("abc"),columns=list("wxyz")) # print(pf) #获取x列值大于1小于10的行 print(pf[(pf["x"]>1)&(pf["x"]<10)]) #注意:不同的条件之间需要用括号括起来
四、布尔索引
缺失值数据处理
缺失值一个分为两种情况:一种是空与None 另一种是某些为0的数据 注意:pandas的NaN和np.nan是一样的
import pandas as pd import numpy as np pf = pd.DataFrame(np.arange(12).reshape(3,4),index=list("abc"),columns=list("wxyz")) # print(pf) pf.iloc[[1,2],0] = "" pf.iloc[0,0] = 1 print(pf) #处理w列为空的值 a = pf[‘w‘].fillna(0) a[a==‘‘] = np.nan pf[‘w‘] = a print(pf) """ 运行结果: w x y z a 1 1 2 3 b 5 6 7 c 9 10 11 w x y z a 1 1 2 3 b NaN 5 6 7 c NaN 9 10 11 """ #判断数据是否为NaN:pd.isnull(pf), pd.notnull(pf) # print(pd.isnull(pf)) #处理方式1:删除NaN所在的行列dropna(axis=0,how=‘any‘,inplace=False) # print(pf.dropna(axis=0)) #删除含有NaN的行 # print(pf.dropna(axis=0,how=‘any‘,inplace=False)) #删除含有NaN的行 inplace:是否原地修改 # print(pf.dropna(axis=0,how=‘all‘)) #必须每行都有NaN才删除 #处理方式2:填充数据,t.fillna(t.mean()), t.fiallna(t.median()), t.fillna(0) # print(pf.fillna(100)) #操作全部 # print(pf[‘w‘].fillna(0)) #操作具体的某一列 #处理为0的数据:t[t==0]=np.nan #注意:不是每次为0的数据都需要处理,计算平均值等情况,nan不参与计算,但0参与计算