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 pd
dict = {"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 zhangsan
age 12
dtype: object
不连续的:
name zhangsan
tel 100
dtype: 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)]) #注意:不同的条件之间需要用括号括起来
#修改、替换操作
#data['area'] = data['area'].apply(lambda x:x.replace('平方米','')).astype(float)
数据筛选:
#单个筛选条件
data[data['price']>3000]
#多个筛选条件 注意:使用 &(且) 和 |(或) 时每个条件都要用小括号括起来
data[(data['price']>3000) & (data['price']<4000)]
data.loc[(data['price']>3000) & (data['price']<4000)]
#选取多列 (选取总价小于40的两列price,area)
# 方法一:
data[['price','area']][data['total_price']<40]
# 方法二:
data.loc[data['total_price']<40,['price','area']]
#选取某列等于多个数值或字符串时,用.isin() (注意:isin括号里是个list)
data[data['make_year'].isin([2019,2012])] #选取年份为2019和2012的数据
#使用loc函数选取
data.loc[(data['make_year']==2019)|(data['make_year']==2012)]
#删除室字段为'7' '9' ...的一整行
data = data.drop(data.loc[(data['室'].isin(['7','9','10','12','15']))].index)
# str.contains() 意思跟SQL语句里用like一样
data.loc[data['floor'].str.contains("高")] #匹配出有“高”的数据
data.loc[data['floor'].str.contains("高|低")] #匹配出有“高”| “低”的数据
四、布尔索引
缺失值数据处理
缺失值一个分为两种情况:一种是空与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参与计算
方法 | 说明 |
cat |
实现元素级的字符串连接操作,可指定分隔符 |
contains |
返回表示各字符串是否含有指定模式的布尔型数组 |
count |
模式的出现次数 |
endswith、startswith | 相当于对各个元素执行x.endswith(patern)或x.startswith(pattern) |
findall | 计算各字符串的模式列表 |
get | 获取各元素的第个字符 |
join |
根据指定的分隔符将Series中各元素的字符串连接起来 |
len | 计算各字符串的长度 |
lower、upper |
转换大小写。相当于对各个元素执行x.lower0或x.upper0 |
match |
根据指定的正则表达式对各个元素执行re.match |
pad |
在字符串的左边、右边或左右两边添加空白符 |
center | 相当于pad(side=/both) |
repeat |
重复值。例如,s.str.repeat(3)相当于对各个字符串执行x*3 |
replace | 用指定字符串替换找到的模式 |
slice | 对Series中的各个字符串进行子串截取 |
split | 根据分隔符或正则表达式对字符串进行拆分 |
strip、rstrip、Ilstrip | 去除空白符,包括换行符。相当于对各个元素执行x.strip()、x.rstrip()、x.lstrip() |