【超详细pandas学习】安装与导入;核心数据结构Series和DataFrame的创建与操作;文件读写操作(CSV、Excel、TXT);数据查看与选择;数据增删改操作;数据清洗(去重、缺失值处理)
本文介绍了Python中pandas库的基本使用方法,主要包括:1)安装与导入;2)核心数据结构Series和DataFrame的创建与操作;3)文件读写操作(CSV、Excel、TXT);4)数据查看与选择;5)数据增删改操作;6)数据清洗(去重、缺失值处理);7)常用统计计算(均值、中位数等);8)数据类型转换;9)数据索引与标签操作;10)数据的数学运算。文章通过具体代码示例,系统讲解了pa
1、安装pandas库
💛打开命令提示符,输入如下指令进行安装
pip install pandas
2.导入pandas库
import pandas as pd
3.主要数据结构
Series
💛类似一维数组,由一组数据和相应的索引组成
-
每个元素有一个唯一的索引(称为
index
),默认从0开始编号。
-
可以为每个元素重新设定唯一的索引(
index
)
🌻通用结构: pd.Series(data, index=index, dtype=dtype)
data:数据,可以是列表,字典或Numpy数组
index:索引,为可选参数
dtype: 数据类型,为可选参数
import pandas as pd
# 创建Series
s= pd.Series(['a','b','c','d','e'], index=[1,2,3,4,5],dtype='float')
print(s)
DataFrame—— 创建二维数组
s_id = pd.Series(["01", "02","03","04","05"])
s_class =pd.Series(["二班","一班","二班","三班","一班"])
s_grade = pd.Series([92, 67,70, 88, 76])
df1 = pd.DataFrame({"学号":s_id, "班级":s_class,"成绩":s_grade})
df1
💛类似二维表格,由多组数据和相应的索引值组成(由多个Series组成)
- Series越多,列越多
- Series中的数据越多,行越多
🌻通用结构: pd.DataFrame(data, index=index, columns=columns)
data:数据,可以是列表,字典或Numpy数组
index:索引,为可选参数
columns: 列标签,为可选参数
import pandas as pd
# 创建DataFrame
df = pd.DataFrame({
'name':['a','b','c'],
'age':[18,35,45],
'gender':['male','female','male']
})
print(s)
通过Series对象创建
import pandas as pd
dict = {"BeiJing": 2154,
"ShangHai": 2424,
"ShenZhen": 1303,
"HangZhou": 981 }
data = pd.Series(dict)
pd.DataFrame(data)
print(pd.DataFrame(data))
#并将其命名为population列
pd.DataFrame(data, columns=["population"])
print(pd.DataFrame(data, columns=["population"]))
4.文件的读取与写入
4..1文件的写入
写入CSV文件:
import pandas as pd
data_read_path =r"F:\joyful-pandas-master\data\my_csv.csv"
data_write_path = r"F:\joyful-pandas-master\data\my_csv_saved.csv"
data = pd.read_csv(data_read_path)
data.to_csv(data_write_path, index=False) # 此时不能打开被写的文件
🌻data.to_csv(data_write_path, index=False)
把data中的数据 ,写入到data_write_path 中,且设置去除索引操作。
写.txt文件
📒写txt文件使用的是:
.to_csv()方法
记得设置分割方式:sep
data.to_csv('data/my_txt_saved.txt', sep='\t', index=False)
写入excel文件:
data.to_excel('data/my_excel_saved.xlsx', index=False)
4.2文件的读取
-
读取CSV文件:
import pandas as pd
data=pd.read_csv('path',sep=',',header=0,names=["第一列","第二列","第三列"],encoding='utf-8')
🌻path: 要读取的文件的绝对路径
📒sep:指定列和列的间隔符,默认sep=‘,’
若sep=‘’\t",即列与列之间用制表符\t分割,相当于tab——四个空格
header:列名行,默认为0
names:列名命名或重命名
encoding:指定用于unicode文本编码格式
import pandas as pd
# 从CSV文件读取数据
df = pd.read_csv('example.csv',header=None)
print(df)
读取Excel文件:
import pandas as pd
# 从Excel文件读取数据
df = pd.read_excel('example.xlsx',header=None)
print(df)
pandas读取xlsx、xls文件
import pandas as pd
data=pd.read_excel('path',sheetname='sheet1',header=0,names=['第一列','第二列','第三列'])
📒path:要读取的文件的绝对路径
sheetname:指定读取excel中的哪一个工作表,默认sheetname=0,即默认读取excel中的第一个工作表
若sheetname = ‘sheet1’,即读取excel中的sheet1工作表;
header:用作列名的行号,默认为header=0
若header=None,则表明数据中没有列名行,若header=0,则表明第一行为列名
names:列名命名或重命名
pandas读取txt文件
read_csv 也可以读取txt文件,读取txt文件的方法同上,也可以用read_table读取txt文件
import pandas as pd
data = pd.read_table('path', sep = '\t', header = None, names = ['第一列','第二列','第三列'])
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)
添加行
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)
删除数据
删除列
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 表示修改原始数据框,不返回新数据框。
删除行
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 表示修改原始数据框,不返回新数据框。
8.数据清洗
# 处理重复数据
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 表示修改原始数据框,不返回新数据框。
处理缺失数据
删除缺失值
💛dropna()函数用于删除含有缺失值的行和列
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)
填充缺失值
💛fillna(value)函数可以填充缺失值为value
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)
9.计算平均值和中位数
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)
求最大值、最小值、求和值、平均值
print(s1.max())
print(s1.min())
print(s1.sum())
print(s1.mean())
💛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'可以把无法转换的数据进行保留
10.index 查看下标,values 查看下标的值
- index:输出类似于 range,start 代表起始标签;stop 代表结束标签(不会取到该值,取到 n - 1 值);step 代表步长。
- values:直接查看从 0 开始下标的值
print(s1.index)
print(s1.values)
#输出结果:
RangeIndex(start=0, stop=5, step=1)
[-1.2 3.7 2.5 -8.2 6.3]
使用 index 指定标签
s2 = pd.Series([1,2,3,4,5], index=[5,4,3,2,1])
s2
iloc 和 loc 的使用
- 💛iloc:是原下标,即默认值,代表计算机的记忆。
- loc:是修改过的下标,称为标签,由用户自主设定,计算机不会自动生成。
# iloc原下标索引
s2.iloc[1]
#输出结果:2
# loc标签索引
s2.loc[1]
#输出结果:5
s2.loc[5:3]
#输出结果:
5 1
4 2
3 3
dtype: int64
11.创建对象
- 这里所理解的键其实是数据的标签,不是字典或数组,而是一维数据。
- 键是字典中的概念,前键后值,构成键值对。
- 筛选数据:“&” 在 Python 中表示 “and” 的意思。
s3 = pd.Series({"小李":82,"小陈":93,"小张":91,"小曾":78, "小邓":68})
s3
#输出结果:
小李 82
小陈 93
小张 91
小曾 78
小邓 68
dtype: int64
#修改数据:使用 loc,找标签 “小张” 让其值等于 95
s3.loc["小张"]=95
s3
#输出结果:
小李 82
小陈 93
小张 95
小曾 78
小邓 68
dtype: int64
12、两个数据相加、相减、相乘、相除
相加 ——add
s1 = pd.Series([1, 4, 2, 3, 5] , index =[1,3,5,7,9])
s2 = pd.Series([8, 1,7,3,9],index =[1,2,3,5,10])
s1+s2
#输出结果:
1 9.0
2 NaN
3 11.0
5 5.0
7 NaN
9 NaN
10 NaN
dtype: float64
💛直接相加可能出现 NaN,此时使用 add 方法,在 s1 的基础上 add(s2,fill_value = “如果出现没有值的情况,以 0 代替”)
s1.add(s2, fill_value =0)
#输出结果:
1 9.0
2 1.0
3 11.0
5 5.0
7 3.0
9 5.0
10 9.0
dtype: float64
相减 ——sub
s1.sub(s2, fill_value =0)
#输出结果:
1 -7.0
2 -1.0
3 -3.0
5 -1.0
7 3.0
9 5.0
10 -9.0
dtype: float64
相乘 ——mul
s1.mul(s2, fill_value =1)
#输出结果:
1 8.0
2 1.0
3 28.0
5 6.0
7 3.0
9 5.0
10 9.0
dtype: float64
相除 ——div
s1.div(s2, fill_value =1)
#输出结果:
1 0.125000
2 1.000000
3 0.571429
5 0.666667
7 3.000000
9 5.000000
10 0.111111
dtype: float64
13.describe ()—— 数据分析方法
s1.describe()
14.apply ()—— 定义函数判断数据
💛apply()用于对数据批量处理
- count:非空值的数量。
- mean:所有数值的平均值。
- std:标准差,表示数据分散程度的一个指标。
- min:最小值。
- 25%:第一四分位数,表示所有数值中 25% 的数据低于这个值。
- 50%:中位数,即排序后的中间值,50% 的数据低于这个值,50% 的数据高于这个值。
- 75%:第三四分位数,表示所有数值中 75% 的数据低于这个值。
- max:最大值。
def get_grade_from_score(score):
if score >=90:
return "A"
elif score >=80:
return "B"
elif score >=70:
return "C"
else:
return "D"
scores = pd.Series({"小李":82,"小陈":93,"小张":91,"小曾":78, "小邓":68})
grades = scores.apply(get_grade_from_score)
grades
#输出结果:
小李 B
小陈 A
小张 A
小曾 C
小邓 D
dtype: object
15.修改标签
💛标签名要统一,否则会报错;标签可缺少,但数据也要一一对应
s_id =pd.Series(["01", "02","03","04","05"], index =["小明","小红","小杰","小丽","小华"])
s_grade = pd.Series([92, 67, 70, 88, 76], index =["小明","小红","小杰","小丽","小华"])
s_class =pd.Series(["二班","一班","二班","三班","一班"], index =["小明","小红","小杰","小丽","小华"])
df1 = pd.DataFrame({"学号":s_id,"班级":s_class,"成绩":s_grade})
df1
#如这样,标签会自动排序好
name = pd.Series(["小陈","小李","小王","小张","小赵","小周"],index =["001", "002","003" ,"004","005","006"])
gender = pd.Series(["女","女","男","男","女","男"], index =["006","005","004","003","002","001"])
height = pd.Series([172.5, 168.0, 178.2, 181.3, 161.7], index =["001", "002","003", "004", "005"])
students = pd.DataFrame({"姓名":name, "性别":gender, "身高":height})
students
#输出结果:
16.查看
查看标签(行属性)
df1.index
#输出结果:
Index(['小明', '小红', '小杰', '小丽', '小华'], dtype='object')
查看列属性
df1.columns
#输出结果:
Index(['学号', '班级', '成绩'], dtype='object')
查看数据
df1.values
#输出结果:
array([['01', '二班', 92],
['02', '一班', 67],
['03', '二班', 70],
['04', '三班', 88],
['05', '一班', 76]], dtype=object)
17.提取数据
df1["班级"]
# df1.班级 效果一样
#输出结果:
小明 二班
小红 一班
小杰 二班
小丽 三班
小华 一班
Name: 班级, dtype: object
- 查看学号和成绩:需要再加一个【】,否则会报错
df1[["学号","成绩"]]
18.查看前几行数据 —— 数据量庞大可使用
💛如果 head()不输入任何的值,其默认值为 5,输出前 5 行数据
df1.head(2)
19.致谢
🌻谢谢大家的阅读,很多不足支出,欢迎大家在评论区指出,如果我的内容对你有帮助,
可以点赞 , 收藏 ,大家的支持就是我坚持下去的动力!
请赐予我平静,去接受我无法改变的 :赐予我勇气,去改变我能改变的!
更多推荐
所有评论(0)