需要完整文件和PPT请点赞关注收藏后评论区留言私信~~~
Pandas(Python Data Analysis Library)是基于NumPy的数据分析模块,它提供了大量标准数据模型和高效操作大型数据集所需的工具,可以说Pandas是使得Python能够成为高效且强大的数据分析环境的重要因素之一。
导入方式:import pandas as pd
Pandas有三种数据结构Series、DataFrame和Panel。 Series类似于数组,DataFrame类似于表格,而Panel则可以视为Excel的多表单Sheet。
1:Series
Series 是一种一维数组对象,包含了一个值序列,并且包含了数据标签,称为索引(index),通过索引来访问数组中的数据。
Series的创建 1)通过列表创建 2)通过字典创建
通过列表创建
import pandas as pd
obj1 = pd.Series([1, -2, 3, -4])
print(obj1)
i = ["a", "c", "d", "a"]
v = [2, 4, 5, 7]
obj2 = pd.Series(v, index = i, name = "col")
print(obj2)
通过字典创建
sdata = {'Ohio': 35000, 'Texas': 71000, 'Oregon': 16000, 'Utah': 5000}
obj3 = pd.Series(sdata)
print(obj3)
不同索引的自动对齐
sdata = {'Ohio': 35000, 'Texas': 71000, 'Oregon': 16000, 'Utah': 5000}
obj1 = pd.Series(sdata)
states = ['California', 'Ohio', 'Oregon', 'Texas']
obj2 = pd.Series(sdata, index = states)
print(obj1+obj2)
索引的修改
obj = pd.Series([4,7,-3,2])
obj.index = ['Bob', 'Steve', 'Jeff', 'Ryan']
print(obj)
2:DataFrame
DataFrame是一个表格型的数据结构,它含有一组有序的列,每列可以是不同的值类型(数值、字符串、布尔值等)。DataFrame既有行索引也有列索引,它可以被看作由Series组成的字典(共用同一个索引)。
构建DataFrame的方式有很多,最常用的是直接传入一个由等长列表或NumPy数组组成的字典来构建DataFrame。
data = {
'name':['张三', '李四', '王五', '小明'],
'sex':['female', 'female', 'male', 'male'],
'year':[2001, 2001, 2003, 2002],
'city':['北京', '上海', '广州', '北京']
}
df1= pd.DataFrame(data, columns = ['name', 'year', 'sex', 'city'])
display(df1)
下面显示DataFrame的索引和列
display(df1)
print(df1.index)
print(df1.columns)
重新索引 索引对象是无法修改的,因此,重新索引是指对索引重新排序而不是重新命名
obj = pd.Series([7.2,-3.3,3.5,3.6],index = ['b', 'a',
'd', 'c'])
obj.reindex(['a','b','c','d','e'])
重建索引时填充缺失值
对于顺序数据,比如时间序列,重新索引时可能需要进行插值或填值处理,利用参数method选项可以设置: method = ‘ffill’或‘pad’,表示前向值填充 method = ‘bfill’或‘backfill’,表示后向值填充
obj.reindex(['a', 'b', 'c', 'd', 'e'], fill_value = 0)
缺失值的前向填充
import numpy as np
obj1 = pd.Series(['blue','red','black'],index = [0,2,4])
obj1.reindex(np.arange(6),method = 'ffill')
DataFrame数据
df2 = pd.DataFrame(np.arange(9).reshape(3,3),
index = ['a','c','d'],columns = ['one','two','four'])
display(df2)
df2.reindex(index = ['a','b','c','d'],columns = ['one','two','three','four'])
传入fill_value = n填充缺失值
df2.reindex(index = ['a','b','c','d'],columns = ['one','two','three','four'], fill_value = 100)
更换索引
在DataFrame数据中,如果不希望使用默认的行索引,则可以在创建时通过Index参数来设置。
df3=df1.set_index('city')
display(df3)
查看DataFrame的常用属性
DataFrame的基础属性有values、index、columns、dtypes、ndim和shape,分别可以获取DataFrame的元素、索引、列名、类型、维度和形状。
print('信息表的所有值为:\n',df3.values)
print('信息表的所有列为:\n',df3.columns)
print('信息表的元素个数为:',df3.size)
print('信息表的维度是:',df3.ndim)
print('信息表的形状为:',df3.shape)
在数据分析中,选取需要的数据进行分析处理是最基本操作。在Pandas中需要通过索引完成数据的选取。
(1) 选取列
通过列索引标签或以属性的方式可以单独获取DataFrame的列数据,返回的数据为Series类型数据。
w1 = df3['name']
print('选取1列数据:\n',w1)
w2 = df3[['name','year']]
print('选取2列数据:\n',w2)
(2)选取行 通过行索引或行索引位置的切片形式可以选取行数据。
display(df3)
print('显示前2行:\n',df3[:2])
print('显示2-3两行:\n',df3[1:3])
(3)选取行和列 切片方法选取行有很大的局限性,如获取单独的几行,可以通过Pandas提供的loc和iloc方法实现。 DataFrame.loc(行索引名称或条件,列索引名称) DataFrame.iloc(行索引位置,列索引位置)
display(df3.loc[:,['name','year']] )
#显示name和year两列
display(df3.iloc[[1,3]])
#显示第1和第3行
display(df3.iloc[[1,3],[1,2]])
使用loc和isin两个函数配合使用,按指定条件对数据进行提取。
如执行语句df5.loc[df5['year'].isin(['2001','2003'])]可以查询2001和2003年的数据。
(4)布尔选择 在Pandas中可以对DataFrame中的数据进行布尔选择,常用的布尔运算符为不等于(!=)、与(&)、或(|)等。
df3[df3['year']==2001]
(5)DataFrame行和列的选取还可以通过query方法实现。 display(df5.query(' year>2001')) display(df5.query('year>2001 & year<2003'))
(1)增加数据 增加一行直接通过append方法传入字典结构数据即可。增加列时,只需为要增加的列赋值即可创建一个新的列。
data1 = {'city':'兰州','name':'小军','year':2005,'sex':'female'}
df4=df3.append(data1,ignore_index = True)
df4['age'] = 20
df4['C'] = [85,78,96,80,93]
display(df4)
(2)删除数据 删除数据直接用drop方法,行列数据通过axis参数确定是删除的是行还是列。
df3.drop('sex',axis = 1,inplace = True)
display(df3)
display(df3.drop('北京'))
(3)修改数据 修改数据时直接对选择的数据直接赋值即可。 Replace:如DataFrame.replace({'B':'E','C':'F'})表示将表中的B替换为E,C替换为F。
算术运算:Pandas的数据对象在进行算术运算时,如果有相同索引则进行算术运算,如果没有则会进行数据对齐,但会引入缺失值。
a = np.arange(6).reshape(2,3)
b = np.arange(4).reshape(2,2)
df1 = pd.DataFrame(a,columns = ['a','b','e'],index = ['A','C'])
print('df1:\n',df1)
df2 = pd.DataFrame(b,columns = ['a','b'],index = ['A','D'])
print('df2:\n',df2)
print('df1+df2:\n',df1+df2)
函数应用和映射:在数据分析时,经常会对数据进行较复杂的运算,此时需要定义函数。定义好的函数可以应用到pandas数据中,其中有三种方法:
map函数,将函数套用到Series的每个元素中;
apply函数,将函数套用到DataFrame的行与列上,行与列通过axis参数设置;
applymap函数,将函数套用到DataFrame的每个元素上。
下面将水果价格表中的元去掉
data = {'fruit':['apple','grape','banana'],'price':['30元','43元','28元']}
df1 = pd.DataFrame(data)
print(df1)
def f(x):
return x.split('元')[0]
df1['price'] = df1['price'].map(f)
print('修改后的数据表:\n',df1)
apply函数的使用方法
df2 = pd.DataFrame(np.random.randn(3,3),columns = ['a','b','c'],
index = ['app','win','mac'])
print(df2)
df2.apply(np.mean)
applymap函数的用法
print(df2)
df2.applymap(lambda x:'%.3f'%x)
1. 数据汇总 在DataFrame中,可以通过sum方法对每列进行求和汇总,与Excel中的sum函数类似。如果设置axis = 1指定轴方向,可以实现按行汇总。
print('按列汇总:\n',df2.sum())
print('按行汇总:\n',df2.sum(axis = 1))
2. 数据描述与统计 描述性统计是用来概括、表述事物整体状况以及事物间关联、类属关系的统计方法。
利用describe方法会对每个数值型列进行统计 通常在对数据的初步观察时使用
数据的频数统计
obj = pd.Series(['a','b','c','a','d','c'])
print(obj.unique())
print(obj.value_counts())
1. 数据分组 根据某个或某几个字段对数据集进行分组,然后对每个分组进行分析与转换是数据分析中常见的操作。Pandas提供了一个高效的groupby方法,配合agg或apply方法实现数据分组聚合的操作。
DataFrame.groupby(by=None, axis=0, level=None, as_index=True, sort=True, group_keys=True, squeeze=False, **kwargs)
df = pd.DataFrame({'key1' : ['a', 'a', 'b', 'b', 'a'],
'key2' : ['yes', 'no', 'yes', 'yes', 'no'],
'data1' : np.random.randn(5),
'data2' : np.random.randn(5)})
grouped = df['data1'].groupby(df['key1'])
print(grouped.size())
print(grouped.mean())
(2)按列名分组 groupby方法使用的分组键除了Series,也可以是其他的格式。DataFrame数据的列索引名可以作为分组键,但需要注意的是用于分组的对象必须是DataFrame数据本身,否则搜索不到索引名称会报错。
groupk1 = df.groupby('key2').mean()
groupk1
(3)按列表或元组分组 分组键还可以是长度和DataFrame行数相同的列表或元组,相当于将列表或元组看作 DataFrame的一列,然后将其分组。 应该是“看作” DataFrame的一列,然后将其分组.
wlist = ['w','w','y','w','y']
df.groupby(wlist).sum()
4)按字典分组 如果原始的DataFrame中的分组信息很难确定或不存在,可以通过字典结构,定义分组信息。
df=pd.DataFrame(np.random.normal(size=(6,5)),index=
['a','b','c','A','B','c'])
print("数据为:\n",df)
wdict={'a':'one','A':'one','b':'two','B':'two','c':'three'}
print("分组汇总后的结果为:\n",df.groupby(wdict).sum())
(5)按函数分组 函数作为分组键的原理类似于字典,通过映射关系进行分组,但是函数更加灵活
def judge(x):
if x>=0:
return 'a'
else:
return 'b'
df = pd.DataFrame(np.random.randn(4,4))
print(df)
print(df[3].groupby(df[3].map(judge)).sum())
聚合运算就是对分组后的数据进行计算,产生标量值的数据转换过程。
(1)聚合函数 除了之前示例中的mean函数外,常用的聚合运算还有count和sum等。
(2)使用agg方法聚合数据 agg、aggregate方法都支持对每个分组应用某个函数,包括Python内置函数或自定义函数。
分组运算包含了聚合运算,聚合运算是数据转换的特例。本节将讲解transform和apply方法,通过这两个方法,可以实现更多的分组运算。
(1)transform方法 通过transform方法可以将运算分布到每一行。
data.groupby(['性别','是否吸烟'])['血小板计数']. transform('mean').sample(5)
(2)使用apply方法聚合数据 apply方法类似于agg方法,能够将函数应用于每一列.
data.groupby(['性别','是否吸烟'])['血小板计数'].apply( np.mean)
(1)读取csv文件
Pandas读取csv文件的格式: read_csv(filepath_or_buffer, sep=',', delimiter=None, header='infer', names=None, index_col=None, usecols=None, squeeze=False, ...)
df1 = pd. read_csv(‘文件路径文件名’) #读取CSV文件到DataFrame中 df2 = pd. read_table(‘文件路径文件名’, sep = ‘,’) #使用read_table,并指定分隔符 df3 = pd. read_csv(‘文件路径文件名’,names = [‘a’,’b’,---]) #文件不包含表头行,允许自动分配默认列名,也可以指定列名
(2)读取excel文件
读取excel文件 Pandas读取excel文件的格式: pandas.read_excel(io,sheet_name = 0,header = 0,names = None,index_col = None,usecols = None,squeeze = False,dtype = None, ...)
xlsx = pd.excelFile(‘example/ex1.xlsx’)
pd.read_excel(xlsx, ‘Sheet1’)
#也可以直接利用:
frame = pd.read_excel(‘example/ex1.xlsx’, ‘Sheet1’)
(3)读取mysql数据
pandas.read_sql(sql, con, index_col=None, coerce_float=True, params=None, parse_dates=None, columns=None, chunksize=None)
import pymysql con =pymysql.connect( host=‘localhost’,user=‘root’,password=‘root’,database=‘test’,port=3306,charset=‘utf8’)
sql_select = ‘select * from a’
df = pd.read_sql(sql_select, con)
(4)读取json数据
Json是一种常用的数据交换格式,在前后端的交互中经常用到,也会在存储的时候选择这种格式。
Pandas读取Json数据的格式:
pandas.read_json(path_or_buf=None,orient=None,type=’frame’,lines=False, ...)
常用文件存储方法如下
创作不易 觉得有帮助请点赞关注收藏~~~