前言:
💞💞大家好,我是书生♡,本阶段和大家一起分享和探索数据分析—基础介绍,本篇文章主要讲述了:数据分析的介绍,Python开源库,配置Jupyter,Pandas读取数据等等。欢迎大家一起探索讨论!!!
💞💞代码是你的画笔,创新是你的画布,用它们绘出属于你的精彩世界,不断挑战,无限可能!
个人主页⭐: 书生♡
gitee主页🙋♂:闲客
专栏主页💞:大数据开发
博客领域💥:大数据开发,java编程,前端,算法,Python
写作风格💞:超前知识点,干货,思路讲解,通俗易懂
支持博主💖:关注⭐,点赞、收藏⭐、留言💬
目录
- 1. Pandas数据结构
- 2. Pandas数据结构
- 2.1 核心结构
- 2.2 Series对象
- 2.2.1 创建Series对象
- 2.2.2 Series常见属性
- 2.2.3 Series常见方法
- 2.2.4 布尔值获取部分数据
- 2.2.5 Sreies对象的运算
- 2.3 dataframe对象
- 2.3.1 创建dataframe对象
- 2.3.2 DataFrame 对象的属性
- 2.3.3 DataFrame对象的方法
- 2.3.4 布尔值获取Dataframe对象中的部分数据
- 2.3.5 DataFrame对象的运算
- 3. pandas读写数据
- 3.1 Excel读写数据
- 3.2 CSV读写数据
- 3.3 json文件
- 4. Pandas读取数据库
- 4.1 连接数据库
- 4.2 存入数据库中
- 4.3 读取数据
1. Pandas数据结构
Pandas 是一个强大的 Python 库,专为数据处理和分析设计。它基于 NumPy 构建,并提供了一系列高效的数据结构和数据分析工具。Pandas 的核心数据结构是 Series
和 DataFrame
,这两个结构非常适合处理表格型数据和时间序列数据。
Pandas核心结构:
Series
DataFrame
Pandas 的核心特点
-
易于使用的数据结构:
- Series:一维数组,可以保存任何数据类型(整数、字符串、浮点数、Python 对象等)。
- DataFrame:二维标签数据结构,可以看作是由 Series 组成的表格,每一列可以是不同的值类型。
-
数据清洗和准备:
- 缺失值处理:Pandas 提供了许多处理缺失数据的方法,如填充、删除或替换。
- 数据转换:可以轻松地转换数据类型、重塑数据结构等。
- 数据合并:提供多种方式来合并数据集,如 join、merge 和 concat。
-
数据选择与索引:
- 灵活的索引选项,包括基于位置的选择和基于标签的选择。
- 支持条件选择,可以轻松过滤数据。
-
时间序列功能:
- 提供丰富的功能来处理时间序列数据,包括日期范围生成、偏移操作、日期解析等。
-
数据读写:
- 支持多种数据格式,如 CSV、Excel、SQL 数据库等。
- 可以处理大型数据集,支持分块读取数据。
-
统计分析:
- 提供了大量的统计函数来分析数据,如描述性统计、排序、分位数等。
-
高级数据操作:
- 支持复杂的数据操作,如分组聚合(groupby)、透视表(pivot tables)等。
-
性能优化:
- 内置的优化算法,可以在处理大数据集时保持较高的性能。
-
数据可视化:
- 与 Matplotlib 和 Seaborn 等可视化库集成良好,可以轻松创建图表。
2. Pandas数据结构
2.1 核心结构
Series
DataFrame
在 Pandas 中,Series
和 DataFrame
是两个核心的数据结构,它们的设计旨在让数据处理和分析变得简单而高效。下面分别介绍这两个数据结构的特点和用途:
Series
Series
是一个一维的带标签数组,它可以容纳任何数据类型(整数、字符串、浮点数、Python 对象等)。Series
的轴标签统称为索引(index)。一个 Series
可以看作是一个字典(dict)或一维 NumPy 数组的一般化版本。
- 特点:
- 由一组数据(数组形式)以及一组与之相关的数据标签(索引)组成。
- 类似于一维数组,但提供了更多的功能,如自动对齐数据、缺失数据处理等。
- 索引可以是任何不可变数据类型,默认索引为整数索引,从 0 开始递增。
- 总结
- 一行或一列数据, 一维数据
- 只有行索引(列名/行号)
- 示例代码:
import pandas as pd
# 创建一个简单的 Series
s = pd.Series([1, 3, 5, np.nan, 6, 8])
print(s)
# 创建一个带有自定义索引的 Series
dates = pd.date_range('20230101', periods=6)
s = pd.Series([1, 3, 5, np.nan, 6, 8], index=dates)
print(s)
DataFrame
DataFrame
是一个二维带标签的数据结构,具有行索引和列索引。你可以把它想象成一个表格或 Excel 工作表,或者一个字典的字典,其中每个键都是一个列名,对应的值是一个 Series
。
- 特点:
- 由两部分组成:一个由列组成的字典(每列都是一个
Series
)和一个索引。 - 可以包含不同类型的列。
- 行索引默认为整数索引,列索引通常是字符串。
- 支持多种数据操作,如选择、过滤、聚合等。
- 由两部分组成:一个由列组成的字典(每列都是一个
- 总结
- 多行多列组成的数据, 二维数据(excel表格/mysql表格)
- 示例代码:
import pandas as pd
# 创建一个简单的 DataFrame
data = {
'A': [1, 2, 3, 4],
'B': [5, 6, 7, 8],
'C': [9, 10, 11, 12],
'D': [13, 14, 15, 16]
}
df = pd.DataFrame(data)
print(df)
# 创建一个带有自定义索引和列名的 DataFrame
dates = pd.date_range('20230101', periods=4)
df = pd.DataFrame(data, index=dates, columns=['B', 'C', 'D', 'A'])
print(df)
-
使用场景
Series
适用于单个数据列的情况,如时间序列数据或单变量数据。DataFrame
适用于多变量数据,特别是当数据有多个维度时。
-
常见操作
- 选择数据:可以通过索引、标签或布尔数组来选择数据。
- 处理缺失数据:
Series
和DataFrame
都提供了处理缺失值的方法,如删除或填充。 - 统计汇总:可以计算均值、最大值、最小值等统计值。
- 数据清洗:包括去除重复项、转换数据类型等。
- 数据转换:如重塑数据、层次化索引、应用函数等。
- 数据合并:通过多种方法合并不同的
Series
或DataFrame
。
2.2 Series对象
2.2.1 创建Series对象
Series对象中, 一列是同一个类型, 类似mysql中的字段类型
data是数据,index是索引也就是我们的行号
pd.Series(data=,index=) 通过numpy的数组类型创建
- 通过numpy的数组类型创建
通过numpy这个Python开源库,调用里面的array方法
import pandas as pd
import numpy as np
# 通过numpy的数组类型创建
n1 = np.array([1,2,3,4])
print(n1)
print(type(n1))
date = pd.Series(data=n1)
print(date)
print(type(date))
注意:import pandas as pd和import numpy as np 只需要执行一次即可,因此我后面代码不会写这两个
- 通过列表创建Series对象
我们自己直接定义列表,然后放进我们的data参数就可以了
date = pd.Series(data=n1,index=['a','b','c','d'])
print(date)
print(type(date))
s1 = pd.Series(data=[1,2,3,4])
print(s1)
我们的列表也可以嵌套
# object : 在这里面就是我们的字符串类型
s1 = pd.Series(data=[1,2,2.11,'aaa',[4,5]],index=['a','b','c','d','e'])
print(s1)
print(type(s1))
- 通过Python元组创建Series对象
我们在之前的创建Series中本质都是先创建一个列表,在进行转换,数组也是,将一个列表通过array转化为数组形式的。
我们现在使用Python的元组创建Series对象,直接创建一个Python类型的元组,不需要进行转换了。
s1 = pd.Series(data=(1,2,3,4.11,5.22222))
print(s1)
print(type(s1))
- 通过Python字典创建Series对象
s1 = pd.Series(data={'a':1,'b':2,'c':3})
print(s1)
print(type(s1))
2.2.2 Series常见属性
我们使用Series对象的属性,格式为:
对象名.属性名
先定义两个Series对象:一个一维的,一个二维的
s1 =pd.Series(data=[1,2,3,4,5,1,2,3])
print(s1)
print(type(s1))
s2 =pd.Series(data=[[1,2,3],[2,3,4],[4,5]],index=['a','b','c'])
print(s2)
print(type(s2))
- 个数Sreies对象元素个数
我们使用
size
这个属性,通过对象名调用
# 个数Sreies对象元素个数
print(s1.size)
print(s2.size)
- 查看形状, 维度
我们使用
shape
这个属性,通过对象名调用
返回元组类型, 元组中元素个数表示维度数 元素值表示行数
# 个数Sreies对象元素个数
print(s1.size)
print(s2.size)
- 查看数据类型,dtype和dtype这两个效果是一样的,用哪一个都可以
我们使用
dtype / dtypes
这个属性,通过对象名调用
# 查看数据类型,dtype和dtype这两个效果是一样的,用哪一个都可以
print(s1.dtype)
print(s1.dtype)
print(s2.dtype)
print(s2.dtypes)
- 查看数据, 返回numpy数组类型
我们使用
values
这个属性,通过对象名调用
# 查看数据, 返回numpy数组类型
print(s1.values)
print(type(s1.values))
- 查看索引值
我们使用
index
这个属性,通过对象名调用
# 查看索引值
print(s1.index)
print(s2.index)
2.2.3 Series常见方法
格式:
对象名.方法名(参数1,参数2....)
- 查看行数
我们使用
len
这个方法,()里面是我们的Series对象
# 查看行数
print(len(s1))
print(len(s2))
- 查看前n个数据
查看前n个数据, 默认前5个, 可以通过n指定
我们使用head()
这个方法,()里面是我们的指定的行数,可以不写,为默认的
# 查看前n个数据, 默认前5个, 可以通过n指定
print(s1.head())
print(s1.head(n=2))
print(s2.head())
print(s2.head(n=2))
- 查看后n个数据
查看后n个数据, 默认前5个, 可以通过n指定
我们使用tail()
这个方法,()里面是我们的指定的行数,可以不写,为默认的
# 查看后n个数据, 默认后5个, 可以通过n指定
print(s1.tail())
print(s1.tail(n=2))
print(s2.tail())
print(s2.tail(n=2))
- 查看索引值
我们使用
keys()
这个方法
索引为字符型的话我们直接显示索引,如果是数字的话只显示起始范围,以及两个索引值之间的差值
# 查看索引值
print(s1.keys())
print(s2.keys())
- 转换成python列表
我们使用
tolist / to_list()
这个方法
tolist和to_list效果是一样的
# 查看索引值
print(s1.keys())
print(s2.keys())
- 转换成dataframe对象
我们使用
to_frame()
这个方法
dataframe对象 是有列名的,因此这个方法会默认给我们的值加上一个列名,默认是从0 开始的
# 转换成dataframe对象
print(s1.to_frame())
print(s2.to_frame())
s1.to_frame()
# s2.to_frame()
- 聚合函数
我们使用
sum / mean/count ()
这个方法
一维数据直接使用这些方法就行,
二维及以上的只能求出内嵌的值,使用apply方法 + sum/len方法
print(s1.sum())
print(s1.mean())
print(s1.count())
print(s2.apply(sum))
print( s2.apply(lambda x: sum(x) / len(x)))
print( s2.apply(len))
- 去重
我们使用
drop_duplicates()
这个方法
返回s对象 , 只能对一维进行去重,多维的数据不能直接只用这个方法
# 去重, 返回s对象
print(s1.drop_duplicates())
# print(s2.apply(drop_duplicates)) # 嵌套的不能直接使用drop_duplicates进行去重
# 去重, 返回数组对象
print(s1.unique())
# print(s2.unique()) # 嵌套的不能直接使用unique进行去重,返回数组对象
- 数据值排序
我们使用
sort_values()
这个方法,里面是我们的排序是升序还是降序,默认是TRUE是升序的
对数据值排序 ,默认是TRUE,升序的,FALse是降序的
# 对数据值排序 ,默认是TRUE,升序的,FALse是降序的
print(s1.sort_values(ascending=False))
print(s1.sort_values(ascending=True))
print(s2.sort_values(ascending=False))
print(s2.sort_values(ascending=True))
- 索引排序
我们使用
sort_index()
这个方法,里面是我们的排序是升序还是降序,默认是TRUE是升序的
对索引排序 ,默认是TRUE,升序的,FALse是降序的
# 对索引排序 ,默认是TRUE,升序的,FALse是降序的
print(s1.sort_index(ascending=False))
print(s1.sort_index(ascending=True))
print(s2.sort_index(ascending=False))
print(s2.sort_index(ascending=True))
- 统计每个值出现的次数
我们使用
value_counts()
这个方法 相当于 --》分组计数
# 统计每个值出现的次数->分组计数 ※
print(s1.value_counts())
print(s2.value_counts())
2.2.4 布尔值获取部分数据
ages = pd.Series([18,20,22,16,21])
print(ages)
print(type(ages))
同年纪和平均值进行判断,年纪》平均值为TRue,反之为False
最后取出,为TRUE的=
print(type(ages))
#%%
# 获取大于等于平均年纪的数据
# 计算平均值
avg = ages.mean()
print(avg)
# 对象中的ages大于等于平均值进行比较,返回布尔值,并且将布尔值转换Series
print(ages>=avg)
# 获取大于等于平均值的数据 s[布尔值列表/布尔值s对象/布尔值数组]
print(ages[ages>=avg])
# 通过布尔值数组获取s对象中的部分数据
bool_array = np.array([False,True,True,False,True])
ages[bool_array]
2.2.5 Sreies对象的运算
对象的运算只要分为两种:
- s对象和数值之间进行计算, s对象中的每个值都要和数值进行计算
- s对象之间进行计算, 根据索引值相同进行计算, 索引值不同用NaN值代替计算结果
- s对象和数值之间进行计算:主要是S对象中的某一个列和常数进行计算
ages = pd.Series([18,20,22,16,21])
# 年纪+10
print(ages+10)
# 年纪*2
print(ages*2)
# 年纪取余
print(ages%2)
# 对象之间的计算
print(ages+ages)
- s对象之间计算:根据索引值相同进行计算, 索引值不同用NaN值代替计算结果
new_ages = pd.Series(data=[10, 20, 30], index=[1, 3, 5])
new_ages
ages + new_ages
2.3 dataframe对象
2.3.1 创建dataframe对象
pd.DataFrame(data=, index=, columns=)
- data: 数据
- index: 指定索引, 默认是从0开始的整数
- columns: 指定列名, 默认是从0开始的整数
# data: 数据
# index: 指定索引, 默认是从0开始的整数
# columns: 指定列名, 默认是从0开始的整数
# pd.DataFrame(data=, index=, columns=)
# 通过python字典创建
# key值是df中的列名, value值是df中的数据值
data_dict = {"姓名": ['小红', '小明', '张三'],
"年龄": [16, 18, 22],
"性别": ["女", "男", "男"]}
df1 = pd.DataFrame(data=data_dict, index=['a', 'b', 'c'])
df1
# 通过二维数据创建
# 列表中有几个元素就是有几列, 嵌套列表中有几个元素就是有几行
# data_list = [["小红", 18, "女", 168], ["小明", 20, "男", 178], ["老王", 35, "女" ,160]]
data_list = [("小红", 18, "女", 168), ("小明", 20, "男", 178), ("老王", 35, "女" ,160)]
df2 = pd.DataFrame(data=data_list, index=["a", "b", "c"], columns=["姓名", "年龄","性别", "身高"])
df2
# s.to_frame(): 将s对象转换成df对象
# pd.read_csv(): 读取数据转换成df对象
注意:
- s.to_frame(): 将s对象转换成df对象
- pd.read_csv(): 读取数据转换成df对象
2.3.2 DataFrame 对象的属性
数据准备:
df = pd.read_csv('/root/Python_Spark/day0/scientists.csv')
df
- 查看索引 – index
# 查看索引
print(df.index)
- 查看列名 —columns
# 查看列名
print(df.columns)
- 查看数据 —values
# 查看数据,返回二维数组类型
print(df.values)
- 查看形状(几行,几列)
# 查看形状(几行,几列)
print(df.shape)
- 查看数据类型
# 查看数据类型(每一列的数据类型)
print(df.dtypes)
- 查看数据个数(行数* 列数)
# 查看数据个数(行数* 列数)
print(df.size)
2.3.3 DataFrame对象的方法
DataFrame对象的方法大部分都和Series对象的方法差不多,因此就不全部讲了
# 查看前n行数据, 默认5行, 通过n参数指定
print(df.head())
print(df.head(n=3))
# 查看后n行数据, 默认5行, 通过n参数指定
print(df.tail())
print(df.tail(n=2))
# 查看列名
print(df.keys())
# 聚合函数 -> 对每列进行聚合操作
print(df.sum())
print(df.mean())
- 打印数值的统计描述,打印数值列统计描述信息 个数/平均值/标准差/最小值/分位值/最大值
# 打印数值的统计描述
print(df.describe())
- 打印字符串列统计描述信息 个数/唯一值个数/出现次数最多的值/出现次数
df.describe(include=['object'])
- 对索引值排序
df.sort_index(ascending=False)
- 查看基本信息 类型/索引/列名/非空值个数/列类型/不同类型列数量/内存大小
# 查看基本信息
df.info()
2.3.4 布尔值获取Dataframe对象中的部分数据
- 获取df中一列的数据
# 获取df中一列的数据
s = df['Age']
print(s)
print(type(s))
- 获取df中一列的数据的平均值
# 获取df中一列的数据的平均值
print(s.mean())
- 获取df中一列的数据的值大于平均值
# 获取df中一列的数据的值大于平均值
# 先获取年纪和平均值的比较,大于为true,小于为false
print(s > s.mean())
# 再获取大于平均值的数据
print(s[s > s.mean()])
- 通过布尔值列表获取df中部分的数据
# 通过布尔值列表获取df中部分的数据
bool_list = [False, True, True, True, False, False, False, True]
n1= np.array(bool_list)
print(n1)
print(s[n1])
2.3.5 DataFrame对象的运算
- ①df对象和数据之间进行计算, df对象中的每个值都要和数值进行计算 -> 非数值列只能进行乘法计算(复制粘贴)
- ②df对象之间进行计算, 根据行索引值相同进行计算, 索引值不同用NaN值代替计算结果 -> 非数值列只能进行加法计算(复制粘贴)
- df对象和数据之间进行计算
# df对象和数据之间进行计算
df * 2
- 获取df中的数值列进行计算
# 获取df中的数值列进行计算
print(df['Age'] + df['Age'])
print(df['Age'] + 10)
- df对象之间进行计算
# df对象之间进行计算, 根据行索引值相同进行计算, 索引值不同用NaN值代替计算结果 -> 非数值列只能进行加法计算(复制粘贴)
df + df
- 获取对应索引值的值
# 获取索引值在0,2,4之间的值,存在为true,否则为false
df.index.isin(values=[0,2,4])
- 获取对应索引值的数据
# 获取索引值在0,2,4之间的数据
new = df[df.index.isin(values=[0, 2, 4])]
new
- df对象和df对象之间进行计算
# df对象和df对象之间进行计算
df + new
3. pandas读写数据
Pandas 提供了多种方法来读取和写入数据文件,这些方法使得数据处理变得非常方便。这里我将介绍一些最常见的读写操作,包括从CSV、Excel、SQL数据库等来源读取数据,以及将数据写回到这些格式中。
准备数据:
import pandas as pd
data = [
[1, '张三', '1999-3-10', 18],
[2, '李四', '2002-3-10', 15],
[3, '王五', '1990-3-10', 33],
[4, '隔壁老王', '1983-3-10', 40]
]
df = pd.DataFrame(data=data, columns=['id', 'name', 'birthday', 'age'])
df
注意:
因为我们的pycharm虽然在本地,但是我们是连接到Linux上面,因此我们的文件直接都保存到Linux对应的目录下面,如果我们想要本地查看我们可以下载到本地上。
3.1 Excel读写数据
- 保存到Excel
# 保存
# df.to_excel(name=,sheet_name=,index=,header=)
# name:文件路径
# sheet_name:sheet名称
# index:是否保存行索引
# header:是否保存列名
df.to_excel('output/data.xlsx',sheet_name='student', index=False,header=True)
- 读取
# 读取
# pd.read_excel(name=, shee_name=, index_col=)
# name: 文件路径
# shee_name: sheet名称
# index_col: 将哪列作为索引 索引下标, 列名
# parse_dates: 将列解析成日期格式 接受列名列表
new_df = pd.read_excel('output/data.xlsx', sheet_name="student", index_col=0, parse_dates=["birthday"])
new_df
- 查看详细信息
# 查看详细信息
new_df.info()
3.2 CSV读写数据
- 保存到csv文件
# 保存
# df.to_csv(path_or_buf=, sep=, index=, header=)
# path_or_buf:文件路径
# sep: 数据列之间的分隔符, 默认逗号
# index: 是否保存行索引
# header: 是否保存列名
df.to_csv(path_or_buf='output/student.csv', index=True, header=True)
# 以\t制表符为分隔符存储, .tsv格式
df.to_csv(path_or_buf='output/student.tsv', sep="\t", index=True, header=True)
- 读取
# 读取
# pd.read_csv(filepath_or_buffer=, sep=, index_col=, parse_dates=, usecols=)
# filepath_or_buffer:文件路径
# sep:分隔符
# index_col:指定哪列作为索引
# parse_dates: 将列解析为日期类型
# usecols: 读取哪些列
new_df = pd.read_csv(filepath_or_buffer='output/student.csv', sep=',', index_col=0, parse_dates=['birthday'], usecols=['name', "birthday"])
new_df
# pd.read_csv('output/student.tsv', sep='\t')
- 查看详细信息
# 查看详细信息
new_df.info()
3.3 json文件
df.to_json('output/student.json')
pd.read_json('output/student.json')
4. Pandas读取数据库
4.1 连接数据库
- 第一步:连接我们的数据库
# 导入sqlalchemy的数据库引擎
from sqlalchemy import create_engine
# 创建数据库引擎,传入url规则的字符串
engine = create_engine('mysql+pymysql://用户名:密码@IP地址:端口号/数据库名?charset=utf8')
# mysql+pymysql://root:123456@192.168.88.100:3306/test?charset=utf8
# mysql 表示数据库类型
# pymysql 表示python操作数据库的包
# root:123456 表示数据库的账号和密码,用冒号连接
# 192.168.88.100:3306/test 表示数据库的ip和端口,以及名叫test的数据库
# charset=utf8 规定编码格式
我们可以连接虚拟机的和本地的
- 连接虚拟机:虚拟机上的mysql,我们只需要连接ip和端口或以及库名就可以了,不需要配置其他的
虚拟机上的ip我们可以使用虚拟机对外公布的ip或者是127.0.0.1 因为我们的环境是执行在Linux上的因此127.0.0.1也是我们虚拟机上的- 本地连接:我们要先知道我们电脑的ip,Win+R 输入cmd
输入ipconfig 查看我们无线局域网的ipv4的ip地址。这个就是我们的电脑的。
然后打开pychar连接数据库,进入之后,选择Mysql数据库中的mysql库中的user表
执行下列sql,之后就可以进行连接了
use mysql;
select host,user from user; #查看数据库的权限信息
update user set host = '%' where user ='root'; #修改权限
flush privileges;#刷新
4.2 存入数据库中
我们使用to_sql
这个方法,注意我们需要传入的参数,表的名称,数据库连接引擎,存入方式是覆盖还是追加
# df.to_sql()方法将df数据快速写入数据库, 表不存在时会自动创建
df.to_sql(name='student', con=engine, index=False, if_exists='append')
# name:数据表的名称
# con:数据库交互引擎对象
# index=False: 表示不将索引保存到数据表中
# if_exists: 数据写入方式, append->追加写入 replace->覆盖写入
4.3 读取数据
- to_sql 读取数据库:即可以通过sql读取,也可以通过表名读取
# 根据sql语句
pd.read_sql(sql='select * from student', con=engine)
# =根据表名
pd.read_sql(sql='student', con=engine, columns=['name', 'id'])
- read_sql_query(只能读取sql语句)
pd.read_sql_query(sql="select * from student", con=engine)
- read_sql_table(只能读取表名)
pd.read_sql_table(table_name="student", con=engine, columns=['name', 'id'])
💕💕在这篇文章中,我们深入探讨了数据分析的介绍,Python开源库,配置Jupyter等等相关使用,希望能为读者带来启发和收获。
💖💖感谢大家的阅读,如果您有任何疑问或建议,欢迎在评论区留言交流。同时,也请大家关注我的后续文章,一起探索更多知识领域。
愿我们共同进步,不断提升自我。💞💞💞