Pandas中Series、DataFrame讲解及操作详解(超详细 附源码)

需要完整文件和PPT请点赞关注收藏后评论区留言私信~~~

Pandas(Python Data Analysis Library)是基于NumPy的数据分析模块,它提供了大量标准数据模型和高效操作大型数据集所需的工具,可以说Pandas是使得Python能够成为高效且强大的数据分析环境的重要因素之一。

导入方式:import pandas as pd

一、Pandas中的数据结构

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)

Pandas中Series、DataFrame讲解及操作详解(超详细 附源码)_第1张图片

下面显示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'])

Pandas中Series、DataFrame讲解及操作详解(超详细 附源码)_第2张图片

传入fill_value = n填充缺失值

df2.reindex(index = ['a','b','c','d'],columns = ['one','two','three','four'], fill_value = 100)

 Pandas中Series、DataFrame讲解及操作详解(超详细 附源码)_第3张图片

更换索引

在DataFrame数据中,如果不希望使用默认的行索引,则可以在创建时通过Index参数来设置。

df3=df1.set_index('city')
display(df3)

 Pandas中Series、DataFrame讲解及操作详解(超详细 附源码)_第4张图片

查看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)

DataFrame数据的查询

在数据分析中,选取需要的数据进行分析处理是最基本操作。在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]])

Pandas中Series、DataFrame讲解及操作详解(超详细 附源码)_第5张图片

使用loc和isin两个函数配合使用,按指定条件对数据进行提取。

如执行语句df5.loc[df5['year'].isin(['2001','2003'])]可以查询2001和2003年的数据。

(4)布尔选择 在Pandas中可以对DataFrame中的数据进行布尔选择,常用的布尔运算符为不等于(!=)、与(&)、或(|)等。 

df3[df3['year']==2001]

Pandas中Series、DataFrame讲解及操作详解(超详细 附源码)_第6张图片

(5)DataFrame行和列的选取还可以通过query方法实现。 display(df5.query(' year>2001')) display(df5.query('year>2001 & year<2003')) 

DataFrame数据的编辑

(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数据运算

算术运算: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中Series、DataFrame讲解及操作详解(超详细 附源码)_第7张图片

函数应用和映射:在数据分析时,经常会对数据进行较复杂的运算,此时需要定义函数。定义好的函数可以应用到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)

Pandas中Series、DataFrame讲解及操作详解(超详细 附源码)_第8张图片

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)

Pandas中Series、DataFrame讲解及操作详解(超详细 附源码)_第9张图片

二、数据汇总与统计 

1. 数据汇总 在DataFrame中,可以通过sum方法对每列进行求和汇总,与Excel中的sum函数类似。如果设置axis = 1指定轴方向,可以实现按行汇总。

print('按列汇总:\n',df2.sum())
print('按行汇总:\n',df2.sum(axis = 1))

2. 数据描述与统计 描述性统计是用来概括、表述事物整体状况以及事物间关联、类属关系的统计方法。

利用describe方法会对每个数值型列进行统计 通常在对数据的初步观察时使用

Pandas中Series、DataFrame讲解及操作详解(超详细 附源码)_第10张图片

数据的频数统计

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())

Pandas中Series、DataFrame讲解及操作详解(超详细 附源码)_第11张图片

(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内置函数或自定义函数。

Pandas中Series、DataFrame讲解及操作详解(超详细 附源码)_第12张图片

 Pandas中Series、DataFrame讲解及操作详解(超详细 附源码)_第13张图片

分组运算

分组运算包含了聚合运算,聚合运算是数据转换的特例。本节将讲解transform和apply方法,通过这两个方法,可以实现更多的分组运算。

(1)transform方法 通过transform方法可以将运算分布到每一行。

data.groupby(['性别','是否吸烟'])['血小板计数']. transform('mean').sample(5)

 Pandas中Series、DataFrame讲解及操作详解(超详细 附源码)_第14张图片

(2)使用apply方法聚合数据 apply方法类似于agg方法,能够将函数应用于每一列.

Pandas中Series、DataFrame讲解及操作详解(超详细 附源码)_第15张图片

data.groupby(['性别','是否吸烟'])['血小板计数'].apply( np.mean)

 四、Pandas数据读取与存储

(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, ...)

常用文件存储方法如下

Pandas中Series、DataFrame讲解及操作详解(超详细 附源码)_第16张图片

 创作不易 觉得有帮助请点赞关注收藏~~~

你可能感兴趣的:(python,pandas,python,数据分析,数据挖掘)