• 博客园logo
  • 会员
  • 周边
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
汜水
博客园    首页    新随笔    联系   管理    订阅  订阅

Pandas学习

1.Pandas简介

Pandas 是 Python 中用于数据分析的核心第三方库,提供易用的数据结构,擅长处理表格形式的结构化数据;支持从各类数据源导入数据,可以完成数据读取、清洗、统计分析与输出,广泛用于数据科学领域。

核心设计理念包括:
  1. 标签化数据结构:提供带标签的轴
  2. 灵活处理缺失数据:内置 NaN 处理机制
  3. 智能数据对齐:自动按标签对齐数据
  4. 强大 IO 工具:支持从 CSV、Excel、SQL 等 20 + 数据源读写
  5. 时间序列处理:原生支持日期时间处理和频率转换

image

2.Series

(一)Series的创建

 

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

image

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

image

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

image

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

image

(二)Series的属性

image

(三)访问Series数据

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

(四)Series的常用方法

image

image

# 查看所有的描述信息
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)

image

(一)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) #输出:

 image

#通过字典来创建
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 #输出:

image

(二)DataFrame的属性

image

# 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时都已经介绍过了,就不一 一赘述了。

image

(五)案例

学生成绩分析

# 案例 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.数据分析步骤

image

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)

image

# 长表转宽表
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.总结

image

posted on 2026-09-18 16:57  汜水  阅读(15)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2026
浙公网安备 33010602011771号 浙ICP备2021040463号-3