Pandas学习
1.Pandas简介
Pandas 是 Python 中用于数据分析的核心第三方库,提供易用的数据结构,擅长处理表格形式的结构化数据;支持从各类数据源导入数据,可以完成数据读取、清洗、统计分析与输出,广泛用于数据科学领域。
核心设计理念包括:
- 标签化数据结构:提供带标签的轴
- 灵活处理缺失数据:内置 NaN 处理机制
- 智能数据对齐:自动按标签对齐数据
- 强大 IO 工具:支持从 CSV、Excel、SQL 等 20 + 数据源读写
- 时间序列处理:原生支持日期时间处理和频率转换

2.Series
(一)Series的创建
# series的创建
import pandas as nd
s = pd.Series([1,2,3,4,5])
print(s) # 输出:

# 自定义索引
s = pd.Series([1,2,3,4,5],index=['A','B','C','D','E'])
print(s) # 输出:

# 定义name
s = pd.Series([1,2,3,4,5],index=['A','B','C','D','E'],name = '月份‘)
print(s) # 输出:

# 通过字典来创建
s = pd.Series({"a":1,"b":2,"c":3,"d":4,"e":5})
s1 = pd.Series(s,index=["a","c"])
print(s) # 输出:
![]()
(二)Series的属性

(三)访问Series数据
# 访问数据
print(s['c']) #输出:3
print(s[s<3]) #输出:a 1
#b 2
print(s.head()) # 默认返回前五行数据
print(s.tail(1)) # 返回最后一行数据
(四)Series的常用方法


# 查看所有的描述信息
s.describe()
# 获取元素个数(忽略缺失值)
print(s.count())
# 获取索引
print(s.keys()) # 方法
print(s.index) # 属性
print(s.isna()) # 检查Series里的每一个元素是否为缺失值
s.isin([4,5,6]) # 检查每个元素是否在参数集合中
print(s.mean()) # 平均值
print(s.std()) # 标准差
print(s.var()) # 方差
print(s.mode()) # 众数(打印出现频率最多的数)
print(s.value_counts()) # 打印每个元素出现的次数
s.drop_duplicates() # 去重
print(s.nunique()) # 去重后元素的个数
# 排序
s.sort_index() # 按索引排序
s.sort_values()# 按值排序
3.案例
(一)学生成绩统计
# 创建一个包含10名学生数学成绩的Series,成绩范围在50-100之间。
# 计算平均分、最高分、最低分,并找出高于平均分的学生人数
import pandas as pd
import numpy as np
# 生成随机成绩
np.random.seed(42)
scores = pd.Series(np.random.randint(50,101,10),index = ['学生’+str(i) for i in range(1,11)])
print('平均分:',scores.mean())
print('最高分:',scores.max())
print('最低分:',scores.min())
# 高于平均分的学生人数
mean = scores.mean()
counts = scores[scores>mean].count()
print(counts)
(二)温度数据分析
# 给定某城市一周每天的最高温度 Series,完成以下任务:
# 找出温度超过 30 度的天数
# 计算平均温度
# 将温度从高到低排序
# 找出温度变化最大的两天
import pandas as nd
temperatures = pd.Series ([28, 31, 29, 32, 30, 27, 33],
index=[' 周一 ', ' 周二 ', ' 周三 ', ' 周四 ', ' 周五 ', ' 周六 ', ' 周日 '])
# 找出温度超过 30 度的天数
rest1 = temperatures[temperatures>30].count
print("超过30度的天数:",rest1)
# 计算平均温度
rest2 = temperatures.mean()
print("平均温度:",rest2)
# 将温度从高到低排序
rest3 = temperatures.sort_values(ascending=False)
print("结果为:",rest3)
# 找出温度变化最大的两天
rest3 = temperatures.diff().abs() # 计算后一个元素与前一个元素的差值
n = rest3.sort_values(ascending=False).keys()
print("温度变化最大的两天:",n[:2].tolist())
4.DataFrame介绍
DataFrame 是 pandas 里面的二维表格数据结构(类似 Excel 表格):有行 (index)、列 (columns)

(一)DataFrame的创建
#dataframe的创建方式
import pandas as nd
import numpy as np
#通过series来创建
s1 = pd.Series([1,2,3,4,5])
s2 = pd.Series([6,7,8,9,10])
df = pd.DataFrame({"第一列":s1,"第二列":s2})
print(df) #输出:

#通过字典来创建
df = pd.DataFrame(
{
"id":[1,2,3,4,5],
"name":["tom","Jack","alice","bob","allen"],
"age":[15,17,20,26,30],
"score":[60.5,80,30.6,70,83.5]
}
)
df #输出:

(二)DataFrame的属性

# dataframe的属性
print(df.index) # 行索引
print(df.columns) # 列标签
print(df.ndim) # 维度
print(df.shape) # 形状
print(df.size) # 元素个数
print(df.dtypes) # 数据类型
print(df.T) # 行列转置
# 获取name这一列数据
print(df.loc[:,'name'])
print(df.iloc[:,0])
# 单个元素
print(df.at[3,'score']) #显式
print(df.iat[2,1]) # 隐式
...
(三)访问DataFrame的数据
# 获取单列数据
print(df['name'])
print(df.name)
# 获取多列数据
print(df[['name','score']])
# 随机抽样
print(df.sample)
(四)DataFrame的常用方法
其中许多方法在前面学习series时都已经介绍过了,就不一 一赘述了。

(五)案例
学生成绩分析
# 案例 1:学生成绩分析
# 场景:某班级的学生成绩数据,完成下面 3 项任务
# 1.计算每位学生的总分和平均分。
# 2.找出数学成绩高于 90 分或英语成绩高于 85 分的学生。
# 3.按总分从高到低排序,并输出前 3 名学生。
import pandas as pd
data = {
'姓名': ['张三', '李四', '王五', '赵六', '钱七'],
'数学': [85, 92, 78, 88, 95],
'英语': [90, 88, 85, 92, 80],
'物理': [75, 80, 88, 85, 90]
}
scores = pd.DataFrame(data)
# 1.计算每位学生的总分和平均分。
scores['总分'] = scores[['数学','英语','物理']].sum(axis=1)
scores['平均分'] = scores['总分'] / 3
scores['平均分2'] = scores[['数学','英语','物理']].mean(axis=1)
# 2.找出数学成绩高于 90 分或英语成绩高于 85 分的学生。
scores[(scores['数学'] > 90) | (scores['英语'] > 85)]
# 3.按总分从高到低排序,并输出前 3 名学生。
r1 = scores.sort_values('总分',ascending=False).head(3)
r2 = scores.nlargest(3,columns=['总分']) # 返回某列数值最大的前 n 行
5.数据分析步骤

6.数据的导入导出
import pandas as np
# 数据的导入
df = pd.read_csv('data/你的文件名')
print(type(df)) # 输出:<class 'pandas.core.frame.DataFrame'>
# 数据的导出
df = df.tail()
df.to_csv('data/新的文件名')
# json
df = pd.read_json('你的文件路径')
import json
with open('你的json文件名') as f:
data = json.load(f)
df = pd.DataFrame(data['users']) # 从文件对象 f 读取 json 文件,转为 python 字典(dict)
7.pandas缺失值的处理
# 缺失值的处理
import pands as pd
import numpy as np
s = pd.Series([1,2,np.nan,None,pd.NA]) # nan:not a number
df = pd.DataFrame([1,pd.NA,2],[2,3,5].[None,4,6])
# 查看是否是缺失值
print(s.isna())
print(s.isnull())
print(df.isna().sum()) # 查看缺失值的个数
print(df.isnull())
# 剔除缺失值
print(s.dropna())
print(df.dropna()) # 删除一整条行记录
print(df.dropna(axis=1)) # 删除一整条列记录
print(df.dropna(how='all')) # 如果所有的值都是缺失值,删除这一行
print(df.dropna(thresh=2)) # 如果至少有n个值不是缺失值,就保留
print(df.dropna(subset=['第一列'])) # 如果某列有缺失值,则删除这一行
# 填充缺失值
df.isna().sum(axis=0)
print(df.fillna({'temp_max':20})) # 使用字典来填充
print(df.fillna(df[['wind']].mean()) # 使用统计值填充
print(df.ffill()) # 用前面的相邻值填充
print(df.bfill()) # 用后面的相邻值填充
8.pandas数据类型转换
import pandas as pd
data = {
"name": ['alice', 'alice', 'bob', 'alice', 'jack', 'bob'],
"age": [26, 25, 30, 25, 35, 30],
'city': ['NY', 'NY', 'LA', 'NY', 'SF', 'LA']
}
df = pd.DataFrame(data)
df.duplicated() # 一整条记录都是一样的,标记为重复,返回True
df.drop_duplicates(subset=['name']) # 去除重复的(根据指定的列)
df.drop_duplicates(subset=['name'],keep='last') # 保留最后一次出现的行
# 数据类型的转换
df = pd.read_csv('你的文件路径')
df['age'] = df['age'].astype('int16')
9.pandas数据变形
import pandas as pd
data = {
'ID': [1, 2],
'name': ['alice', 'bob'],
'Math': [90, 85],
'English': [88, 92],
'Science': [95, 89]
}
df = pd.DataFrame(data)
print(df)
df.T # 行列转置
# 宽表转换成长表
df2 = pd.melt(df,id_vars['ID','name'],var_name='科目',value_name='分数')
print(df2)

# 长表转宽表
pd.pivot(df2,index['id','name'],columns='科目',values='分数')
#分列
df[['first','last']] = df['name'].str.split(" ",expand=True)
10.数据分箱
把连续的数值划分成离散的区间(箱子),相当于把数值转为类别
# 数据分箱 pd.cut(x,bins,labels)
import pandas as pd
df = pd.read_csv('你的文件路径')
# 取前10条
df1 = df.head(10)[['employee_id,'salary']]
pd.cut(df1['salary'],bins=2) #bins=n,分成n段区间,起始值、结束值是所有数据的最小值、最大值
# 4180-14100-2400
df1['收入范围'] = pd.cut(df1['salary'],bins=[0,10000.20000,30000],labels=['低','中','高']) #bins=list,分成n段区间
pd.qcut(df1['salary'],3).value_counts() # 等频分箱,把 salary 薪资这一列分成 3 个箱子
11.时间数据的处理
import pandas as pd
d = pd.Timestamp('2015-05-02 10:22')
print(d) # 打印:2015-05-02 10:22:00
print("年:",d.year)
print("月:",d.month)
print("日:",d.day)
print("时分秒:",d.hour,d.minute,d.second)
print("季度:",d.quarter)
print("是否是月底:",d.is_month_end) # false
# 方法
print("星期几:",d.day_name())
# 字符串转换为日期类型
a = pd.to_datatime('20150228')
# daraFrame 日期转换
df = pd.DataFrame({
'sales':[100,200,300].
'date':['20260708','20260911','20260917']
})
df['datetime'] = pd.to_datetime(df['date'])
# csv 日期转换
df = pd.read_csv('data/weather.csv')
df['datetime'] = pd.to_datetime(df['date'])
df['datetime'].dt.day_name() # 单列 Series 不能直接调用元素的方法!先加访问器 dt/str,再调用属性。
12.分组聚合
# 分组聚合
# df.groupby('分组的字段')['聚合的字段'].聚合函数()
import pandas as pd
df = pd.read_csv('你的文件路径')
#计算不同部门的平均工资
df.groupby('department_id').groups # 查看分组
13.总结

浙公网安备 33010602011771号