目录
1.安装pandas库
打开命令提示符,输入如下指令进行安装
pip install pandas
2.导入pandas库
导入pandas库,并简写为pd
import pandas as pd
3.主要核心数据
Series
类似一维数组,由一组数据和相应的索引组成
import pandas as pd
# 创建Series
s= pd.Series(['a','b','c','d','e'])
print(s)
DataFrame
类似二维表格,由多组数据和相应的索引值组成
import pandas as pd
# 创建DataFrame
df = pd.DataFrame({
'name':['a','b','c'],
'age':[18,35,45],
'gender':['male','female','male']
})
print(s)
4.创建一个DataFrame
import pandas as pd
df = pd.DataFrame({
'name':['Xiaoming','Xiaohong','Xiaojun'],
'age':[18,35,45],
'occupation':['student','teacher','doctor']
})
print (df)
该代码创建了一个名为df的Pandas DataFrame,包含三个人的信息:姓名(name)、年龄(age)和职业(occupation)。然后打印这个DataFrame。具体数据如下:
Xiaoming,18岁,学生
Xiaohong,35岁,教师
Xiaojun,45岁,医生
打印结果:
5.查看数据
# 查看前5行数据
print(df.head())
# 查看后5行数据
print(df.tail())
# 显示 DataFrame 的列名、数据类型、非空值数量等基本信息
print(df.info())
# 显示 DataFrame 中数值列的描述性统计信息,如计数、平均值、标准差、最小值、最大值等。
print(df.describe())
6.选择数据
可以通过索引值或切片来选择数据
import pandas as pd
df = pd.DataFrame({
'name':['Xiaoming','Xiaohong','Xiaojun'],
'age':[18,35,45],
'occupation':['student','teacher','doctor']
})
# 选择单列数据
print(df['name'])
# 选择多列数据
print(df[['age','occupation']])
# 选择单行数据
print(df.iloc[0])
# 选择多行数据
print(df.iloc[1:3])
# 根据条件选择数据
print(df[df['age'] > 30])
7.添加与删除与更改数据
添加数据
添加列
import pandas as pd
df = pd.DataFrame({
'name':['Xiaoming','Xiaohong','Xiaojun'],
'age':[18,35,45],
'occupation':['student','teacher','doctor']
})
# 添加一列
df['gender']=['male','female','male']
print(df)
此代码为设置DataFrame df的'gender'列赋值为一个固定列表,由于DataFrame df并没有'gender'列,所以添加这个列
打印结果:
原来的结果(意为4讲的创建一个DataFrame的结果,提供用于方便对比)
添加行
import pandas as pd
df = pd.DataFrame({
'name':['Xiaoming','Xiaohong','Xiaojun'],
'age':[18,35,45],
'occupation':['student','teacher','doctor']
})
# 添加一行
df.loc[3] = ['Xiaoqi', 20, 'student']
print(df)
功能:.loc 主要用于基于行标签或列标签进行选择和赋值。
此代码为设置DataFrame df索引值为3的行赋值为一个固定列表,由于DataFrame df并没有索引值为3的行, 所以添加这个行
打印结果:
原来的结果(意为4讲的创建一个DataFrame的结果,提供用于方便对比)
删除数据
删除列
import pandas as pd
df = pd.DataFrame({
'name':['Xiaoming','Xiaohong','Xiaojun'],
'age':[18,35,45],
'occupation':['student','teacher','doctor']
})
# 删除一列
df.drop('occupation',axis=1,inplace=True)
print(df)
此代码将删除DataFrame df中的列'gender'。
drop方法 用于删除指定的行或列。
'gender' 指定要删除的列名。
axis=1 表示操作在列上进行。
inplace=True 表示修改原始数据框,不返回新数据框。
节省内存,避免创建额外的数据副本。
原始 DataFrame 被永久改变。
打印结果:
原来的结果(意为4讲的创建一个DataFrame的结果,提供用于方便对比)
删除行
import pandas as pd
df = pd.DataFrame({
'name':['Xiaoming','Xiaohong','Xiaojun'],
'age':[18,35,45],
'occupation':['student','teacher','doctor']
})
# 删除一行
df.drop(1,axis=0,inplace=True)
print(df)
此代码将删除DataFrame df中索引值为1的行
1 指定要删除的对象。
axis=0 表示操作在行上进行。(默认为删除行,因此这里可以不输入)
inplace=True 表示修改原始数据框,不返回新数据框。
节省内存,避免创建额外的数据副本。
原始 DataFrame 被永久改变。
打印结果:
原来的结果(意为4讲的创建一个DataFrame的结果,提供用于方便对比)
修改数据
修改列
import pandas as pd
df = pd.DataFrame({
'name':['Xiaoming','Xiaohong','Xiaojun'],
'age':[18,35,45],
'occupation':['student','teacher','doctor']
})
# 修改一列
df['age'] = [20,37,47]
print(df)
此代码为设置DataFrame df的'age'列赋值为一个固定列表,由于DataFrame df已经有'age'列,所以修改这个列
打印结果:
原来的结果(意为4讲的创建一个DataFrame的结果,提供用于方便对比)
修改行
import pandas as pd
df = pd.DataFrame({
'name':['Xiaoming','Xiaohong','Xiaojun'],
'age':[18,35,45],
'occupation':['student','teacher','doctor']
})
# 修改一行
df.loc[2] = ['Xiaoqi', 20, 'student']
print(df)
功能:loc 主要用于基于行标签或列标签进行选择和赋值。
此代码为设置DataFrame df索引值为2的行赋值为一个固定列表,由于DataFrame df已经有索引值为2的行, 所以修改添加这个行
打印结果:
原来的结果(意为4讲的创建一个DataFrame的结果,提供用于方便对比)
8.数据清洗
数据清洗(Data cleaning)是指对数据进行重新审查和校验的过程,目的是为了删除重复信息、纠正存在的错误,并提供数据的一致性。数据清洗是数据预处理的第一步,也是确保后续数据分析结果准确性的关键步骤。
代码用到:
# 处理重复数据
df.drop_duplicates(inplace=True)
# 删除缺失值
df=df.dropna()
# 填充缺失值
df=df.fillna(0)
# 计算平均值
df['mean']=df[['math','chinese','english']].mean(axis=1)
# 计算中位数
df['median']=df[['math','chinese','english']].median(axis=1)
处理重复数据
import pandas as pd
df = pd.DataFrame({
'name':['Xiaoming','Xiaohong','Xiaojun','Xiaoming','Xiaohong'],
'age':[18,35,45,18,35],
'occupation':['student','teacher','doctor','student','teacher']
})
# 处理重复数据
df.drop_duplicates(inplace=True)
print(df)
该函数用于删除Pandas DataFrame中的重复行。
drop_duplicates 方法会保留重复数据中的第一条记录,默认情况下删除其余重复项。
inplace=True 表示修改原始数据框,不返回新数据框。
节省内存,避免创建额外的数据副本。
原始 DataFrame 被永久改变。
打印结果:
处理前的结果(用于对比)
处理缺失数据
删除缺失值
import pandas as pd
df = pd.DataFrame({
'name':['Xiaoming','Xiaohong',None,'Xiaoli','Xiaowang'],
'age':[18,None,45,20,12],
'occupation':['student','teacher','doctor','student',None]
})
# 删除缺失值
df=df.dropna()
print(df)
dropna()函数用于删除含有缺失值的行和列‘
打印结果:
处理前的结果(用于对比)
填充缺失值
import pandas as pd
df = pd.DataFrame({
"name":['Xiaoming','Xiaohong','Xiaojun','Xiaoli','Xiaowang'],
"age":[18,16,15,14,17],
"score":[90,None,70,None,None],
})
# 填充缺失值
df=df.fillna(0)
print(df)
fillna(value)函数可以填充缺失值为value
打印结果:
处理前的结果(用于对比)
计算平均值和中位数
import pandas as pd
df = pd.DataFrame({
'name':['Xiaoming','Xiaohong','Xiaojun','Xiaoli','Xiaowang'],
'math': [85, 90, 78, 92, 88],
'chinese': [75, 80, 85, 90, 95],
'english': [80, 85, 90, 95, 100],
'mean':[None,None,None,None,None],
'median':[None,None,None,None,None]
})
# 计算平均值
df['mean']=df[['math','chinese','english']].mean(axis=1)
# 计算中位数
df['median']=df[['math','chinese','english']].median(axis=1)
print(df)
Pandas 的 mean()函数用于计算 DataFrame 或 Series 中数值的平均值。
Pandas 的 median()函数用于计算 DataFrame 或 Series 中数值的中位数。
axis:指定沿着哪个轴计算。默认为 0,表示按列计算;如果设为 1,则按行计算。
打印结果
处理前的结果(用于对比)
修改数据类型
假设我们有一个表格,其中包含姓名(name)、年龄(age),但年龄列的数据是字符串(str)类型,我们需要把他修改成整数(int)类型:
import pandas as pd
df=pd.DataFrame({
'name':['a','b','c'],
'age':['10','20','30']
})
df['age']=df['age'].astype(int)
print(df)
astype() 是 Pandas 中的一个非常实用的方法,用于将 DataFrame 或 Series 中的数据类型转换为指定的数据类型。
如果年龄(age)列有缺失值,这时候就不能直接使用astype(int),需要使用:
df['age']=df['age'].astype(int,errors='ignore')
errors='ignore'可以把无法转换的数据进行保留
纠正错误数据
假设我们有一个包含学生成绩数据的 DataFrame,其中可能存在一些错误数据。我将逐步展示如何检测和纠正这些错误数据。
import pandas as pd
df = pd.DataFrame({
'name':['Xiaoming','Xiaohong','Xiaojun','Xiaoli','Xiaowang'],
'math': [85, 90, -3, 92, 88],
'chinese': [75, 105, 170, 90, -5],
'english': [80, 85, 90, 95, 102],
'mean':[None,None,None,None,None],
'median':[None,None,None,None,None]
})
#检测并纠正异常值(各科目分数里有哪些分数>100 or <0)
for i in ['math','chinese','english']:
df.loc[df[i]>100,i]=100
df.loc[df[i]<0,i]=0
print(df)
利用for循环对DataFrame df的语数英分数进行遍历,这里利用了loc方法来选取数据。loc方法可以同时选择行和列,并且允许进行更复杂的条件筛选。
在给定的代码中:
df.loc[df[i]>100, i] = 100 这一行的意思是对于列 i(这里 i 是 'math', 'chinese', 'english' 中的一个),找出所有值大于100的行,并将这些行中列 i 的值设置为100。
同样的,df.loc[df[i]<0, i] = 0 这一行是找出所有值小于0的行,并将这些行中列 i 的值设置为0。
打印结果:
处理前的结果(用于对比)
重新排序索引值
import pandas as pd
df=pd.DataFrame({
'name':['a','b','c'],
'age':[11,12,14],
'score':[71,62,55]
},index=[4,5,6])
# 重置索引并忽略原来的索引值
df=df.reset_index(drop=True)
print(df)
使用 reset_index 方法并设置 drop=True 来忽略原来的索引值。
打印结果:
处理前的结果(用于对比)
9.数据分析
数据分组
import pandas as pd
# 假设df是包含学生分数和班级信息的数据框
df=pd.DataFrame({
'class': ['A','B','A','A','A','B','A','B','B','B'],
'score': [90, 85, 75, 65, 95, 85, 70, 90, 80, 85]
})
# 使用groupby()按'class'列分组,然后计算'score'的平均值,结果赋值给新的变量grouped
grouped = df.groupby('class')['score'].mean()
print(grouped)
groupby()函数 是 Pandas 中用于对数据进行分组的强大工具。它允许你按照一个或多个列的值将数据分成不同的组,并对每个组执行聚合操作。
聚合操作(Aggregation Operations)是指在数据处理和数据分析领域中,将数据集中的数据根据一个或多个字段进行分组,并对每个分组执行一个或多个统计函数的过程
grouped = df.groupby('class'):按照 class 列的值将数据分成不同的组。例如,所有 class 为 'A' 的行组成一组,所有 class 为 'B' 的行组成另一组。
['score'].mean():对每个组中的 score 列计算平均值。
打印结果:
Name: score:
含义: 表示该 Series 对象的名称是 score。
dtype: float64:
含义: 表示该 Series 对象的数据类型是 float64,即浮点型数字。’
数据提取
import pandas as pd
df=pd.DataFrame({
'email': ['john.doe@example.com',
'jane.smith@company.org',
'mike.brown@university.edu']
})
# 使用正则表达式提取用户名和域名
result = df['email'].str.extract(r'(\w+)\.(\w+)@(\w+)\.(\w+)')
print(result)
str.extract() 是一个非常强大的工具,可以用于从字符串中提取特定的子串。 (r'(\w+)\.(\w+)@(\w+)\.(\w+)')详细讲解: 第一个捕获组:(\w+) (\w+): 捕获一个或多个字母数字字符(包括下划线)。这里的括号 () 形成一个捕获组。 例如,在 john.doe@example.com 中,这会捕获 john。 第二个捕获组:\. \.: 匹配一个点字符 .。由于点字符在正则表达式中有特殊含义,需要用反斜杠 \ 转义。 例如,在 john.doe@example.com 中,这会匹配 .。 第三个捕获组:(\w+) (\w+): 捕获一个或多个字母数字字符(包括下划线)。这里的括号 () 形成一个捕获组。 例如,在 john.doe@example.com 中,这会捕获 doe。 第四个捕获组:@ @: 匹配一个 @ 字符。 例如,在 john.doe@example.com 中,这会匹配 @。 第五个捕获组:(\w+) (\w+): 捕获一个或多个字母数字字符(包括下划线)。这里的括号 () 形成一个捕获组。 例如,在 john.doe@example.com 中,这会捕获 example。 第六个捕获组:\. \.: 匹配一个点字符 .。由于点字符在正则表达式中有特殊含义,需要用反斜杠 \ 转义。 例如,在 john.doe@example.com 中,这会匹配 .。 第七个捕获组:(\w+) (\w+): 捕获一个或多个字母数字字符(包括下划线)。这里的括号 () 形成一个捕获组。 例如,在 john.doe@example.com 中,这会捕获 com。
(r'(\w+)\.(\w+)@(\w+)\.(\w+)')
r 前缀表示的是 原始字符串(raw string)。使用 r 前缀可以避免在字符串中转义特殊字符
为什么使用 r 前缀
在 Python 中,字符串默认会对某些字符进行转义处理。例如,\n 表示换行符,\t 表示制表符。然而,在正则表达式中,这些转义字符本身具有特殊的含义。如果不使用 r 前缀,就需要多次转义这些特殊字符,这会使正则表达式变得复杂且难以阅读。
打印结果:
如果觉得复杂只想提取完整的用户名和域名的话,可以这样
# 使用正则表达式提取完整的用户名和域名
result = df['email'].str.extract(r'(\w+\.\w+)@(\w+\.\w+)')
print(result)
数据合并
import pandas as pd
df=pd.DataFrame({
'name':['a','b','c'],
'age':[11,12,14],
'score':[71,62,55]
})
df2=pd.DataFrame({
'name':['d','e','f'],
'age':[13,16,12],
'score':[44,85,76]
})
# 合并
All_df=pd.concat([df,df2])
print(All_df)
可以使用concat()函数将数据合并,这里将df与df2合并在一起并赋值给All_df。
打印结果:
可以在concat()函数里加上ignore_index=True把索引值重新排序
# 合并
All_df=pd.concat([df,df2],ignore_index=True)
print(All_df)
打印结果:
总结
对于Pandas库我是一位初学者,把学习过程记录在这篇文章上,希望这篇文章对你有帮助!如有不足的地方可以在评论区补充