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.致谢

🌻谢谢大家的阅读,很多不足支出,欢迎大家在评论区指出,如果我的内容对你有帮助,

可以点赞 , 收藏 ,大家的支持就是我坚持下去的动力!

请赐予我平静,去接受我无法改变的 :赐予我勇气,去改变我能改变的!

    Logo

    惟楚有才,于斯为盛。欢迎来到长沙!!! 茶颜悦色、臭豆腐、CSDN和你一个都不能少~

    更多推荐