蘇阿細 - pandas
type: channel
link: https://km.wangchouchou.com/tag/pandas/
items: 七、pandas - 数据分析 - 案例
items: 六、pandas - 数据分析
items: 五、pandas-DataFrame-案例
items: 四、pandas - DataFrame
items: 三、pandas-Series-案例
items: 二、pandas - Series
items: 一、pandas

七、pandas - 数据分析 - 案例
type: item
date: 2025-12-03T14:46:37+00:00
description: （1）企鹅体重分析# 1. 导入相关库 import numpy as np import pandas as pd # 2. 导入数据 df = pd.read_csv('static/2_pandas/data/penguins.csv') print(df.head(10)) species island bill_length_mm bill_depth_mm flipper_length_mm \ 0 Adelie Torgersen 39.1 18.7 181.0 1 Adelie Torgersen 39.5 17.4 186.0 2 Adelie Torgersen 40.3 18.0 195.0 3 Adelie Torgersen NaN NaN NaN 4 Adelie Torgersen 36.7 19.3 193.0 5 Adelie Torgersen 39.3 20.6 190.0 6 Adelie Torgersen 38.9 17.8 181.0 7 Adelie Torgersen 39.2 19.6 195.0 8 Adelie Torgersen 34.1 18.1 193.0 9 Adelie Torgersen 42.0 20.2 190.0 body_mass_g sex 0 3750.0 Male 1 3800.0 Female 2 3250.0 Female 3 NaN NaN 4 3450.0 Female 5 3650.0 Male 6 3625.0 Female 7 4675.0 Male 8 3475.0 NaN 9 4250.0 NaN # 3. 数据清洗 # 处理缺失值 df.dropna(inplace=True) # 4. 构造数据特征 df['sex'] = df['sex'].astype('category') df['bill_ratio'] = df['bill_length_mm'] / df['bill_depth_mm'] # print(df.head(10)) # 5. 数据分析 # 数据分箱 - 体重：低、中、高 labels = ['低', '中', '高'] df['mass_level'] = pd.cut(df['body_mass_g'], bins=3, labels=labels) print(df['mass_level'].value_counts()) print() # 按岛屿、性别分组 print(df.groupby(['island', 'sex'], observed=False).agg({ 'body_mass_g': ['mean', 'count'] })) mass_level 低 150 中 128 高 55 Name: count, dtype: int64 body_mass_g mean count island sex Biscoe Female 4319.375000 80 Male 5104.518072 83 Dream Female 3446.311475 61 Male 3987.096774 62 Torgersen Female 3395.833333 24 Male 4034.782609 23（2）睡眠质量分析import numpy as np import pandas as pd # 导入数据 df = pd.read_csv('static/2_pandas/data/sleep.csv') print(df.head(10)) person_id gender age occupation sleep_duration sleep_quality \ 0 1 Male 29 Manual Labor 7.4 7.0 1 2 Female 43 Retired 4.2 4.9 2 3 Male 44 Retired 6.1 6.0 3 4 Male 29 Office Worker 8.3 10.0 4 5 Male 67 Retired 9.1 9.5 5 6 Female 47 Student 6.1 6.9 6 7 Male 22 Office Worker 5.1 6.1 7 8 Male 49 Office Worker 10.7 6.2 8 9 Male 25 Manual Labor 11.9 7.2 9 10 Female 51 Retired 8.2 4.0 physical_activity_level stress_level bmi_category blood_pressure \ 0 41 7 Obese 124/70 1 41 5 Ob…

六、pandas - 数据分析
type: item
date: 2025-12-01T14:55:00+00:00
description: 演示数据：data.zip1. 数据的导入导出import pandas as pd # 导入数据 # csv df = pd.read_csv('static/2_pandas/data/employees.csv') print(df.salary.sum()) 691400.0# 导出 df = df.head() df.to_csv('static/2_pandas/data/employees1.csv')# json df_json = pd.read_json('static/2_pandas/data/data1.json') print(df_json) id name age 0 1 张三 25 1 2 李四 30 2 3 王五 28import json # 复杂json with open('static/2_pandas/data/test.json', encoding='utf-8') as f: data = json.load(f) print(type(data)) print(data['users']) print() df_json2 = pd.DataFrame(data['users']) print(df_json2) <class 'dict'> [{'id': 1, 'name': '张三', 'age': 28, 'email': 'zhangsan@example.com', 'is_active': True, 'join_date': '2022-03-15'}, {'id': 2, 'name': '李四', 'age': 35, 'email': 'lisi@example.com', 'is_active': False, 'join_date': '2021-11-02'}, {'id': 3, 'name': '王五', 'age': 24, 'email': 'wangwu@example.com', 'is_active': True, 'join_date': '2023-01-20'}] id name age email is_active join_date 0 1 张三 28 zhangsan@example.com True 2022-03-15 1 2 李四 35 lisi@example.com False 2021-11-02 2 3 王五 24 wangwu@example.com True 2023-01-202. 缺失值的处理import numpy as np import pandas as pd # 缺失值的处理 df = pd.DataFrame([[1, 2, pd.NA], ['A', None, 'D'], [7, 8, 9]], columns=['A', 'B', 'C']) print(df) print() # 检查元素是否是缺失值 print(df.isna()) print(df.isnull()) print() # 计算缺失值个数 # print(df.isna().sum()) # 列 print(df.isna().sum(axis=1)) # 行 A B C 0 1 2.0 <NA> 1 A NaN D 2 7 8.0 9 A B C 0 False False True 1 False True False 2 False False False A B C 0 False False True 1 False True False 2 False False False 0 1 1 1 2 0 dtype: int64# 剔除缺失值 # 剔除包含缺失值的行记录 print(df.dropna()) print() # 当前行的元素都为缺失值时才剔除 print(df.dropna(how='all')) print() # 如果有n个元素不是缺失值，则保留 print(df.dropna(thresh=2)) print() A B C 2 7 8.0 9 A B C 0 1 2.0 <NA> 1 A NaN D 2 7 8.0 9 A B C 0 1 2.0 <NA> 1 A NaN D 2 7 8.0 9# 按列剔除 print(df.dropna(axis=1)) print() # 如果某列有缺失值，则删除这一行 print(df.dropna(subset=['B'])) print() A 0 1 1 A 2 7 A B C 0 1 2.0 <NA> 2 7 8.0 9# 填充缺失值 df = pd.read_csv('static/2_pandas/data/weather_w…

五、pandas-DataFrame-案例
type: item
date: 2025-11-28T14:06:41+00:00
description: （1）学生成绩分析某班级的学生成绩如下：姓名语文数学英语孙笑川909565药水哥919670Giao哥808990刘波7588951.计算每名学生的总分和平均分2.找出数学成绩高于90分或英语成绩高于85分的学生3.按总分降序排序（显示前三名）import numpy as np import pandas as pd data = { "姓名": ["孙笑川", "药水哥", "Giao哥", "刘波"], "语文": [90, 91, 80, 75], "数学": [95, 96, 89, 88], "英语": [65, 70, 90, 95] } scores = pd.DataFrame(data) print(scores) 姓名 语文 数学 英语 0 孙笑川 90 95 65 1 药水哥 91 96 70 2 Giao哥 80 89 90 3 刘波 75 88 95scores['总分'] = scores'语文', '数学', '英语'.sum(axis=1) print(scores) print("================================================") # scores['平均分'] = scores['总分'] / 3 scores['平均分'] = scores'语文', '数学', '英语'.mean(axis=1) print(scores) 姓名 语文 数学 英语 总分 0 孙笑川 90 95 65 250 1 药水哥 91 96 70 257 2 Giao哥 80 89 90 259 3 刘波 75 88 95 258 ================================================ 姓名 语文 数学 英语 总分 平均分 0 孙笑川 90 95 65 250 83.333333 1 药水哥 91 96 70 257 85.666667 2 Giao哥 80 89 90 259 86.333333 3 刘波 75 88 95 258 86.000000print(scores[(scores['数学'] > 90) | (scores['英语'] > 85)]) 姓名 语文 数学 英语 总分 平均分 0 孙笑川 90 95 65 250 83.333333 1 药水哥 91 96 70 257 85.666667 2 Giao哥 80 89 90 259 86.333333 3 刘波 75 88 95 258 86.000000# print(scores.sort_values('总分', ascending=False).head(3)) print(scores.nlargest(3, columns='总分')) 姓名 语文 数学 英语 总分 平均分 2 Giao哥 80 89 90 259 86.333333 3 刘波 75 88 95 258 86.000000 1 药水哥 91 96 70 257 85.666667（2）销售数据分析某公司销售数据如下：产品名称苹果西瓜葡萄梨单价（斤/元）8.53.5105.5销量（斤）5010020300计算每种产品的总销售额2.找出销售额最高的商品3.按销售额降序排序import numpy as np import pandas as pd data = { "产品名称": ["苹果", "西瓜", "葡萄", "梨"], "单价（斤/元）": [8.5, 3.5, 10, 5.5], "销量（斤）": [50, 100, 20, 300] } df = pd.DataFrame(data) print(df) 产品名称 单价（斤/元） 销量（斤） 0 苹果 8.5 50 1 西瓜 3.5 100 2 葡萄 10.0 20 3 梨 5.5 300df['总销售额'] = df['单价（斤/元）'] * df['销量（斤）'] print(df) 产品名称 单价（斤/元） 销量（斤） 总销售额 0 苹果 8.5 50 425.0 1 西瓜 3.5 100 350.0 2 葡萄 10.0 20 200.0 3 梨 5.5 300 1650.0print(df.nlargest(1, columns='总销售额')) 产品名称 单价（斤/元） 销量（斤） 总销售额 3 梨 5.5 300 1650.0print(df.sort_values('总销售额', ascending=False)) 产品名称 单价（斤/元） 销量（斤） 总销售额 3 梨 5.5 300 1650.0 0 苹果 8.5 50 425.0 1 西瓜 3.5 100 350.0 2 葡萄 …

四、pandas - DataFrame
type: item
date: 2025-11-24T13:57:00+00:00
description: 1. 创建方法import numpy as np import pandas as pd # 通过Series创建 s1 = pd.Series([1, 2, 3]) s2 = pd.Series([4, 5, 6]) df = pd.DataFrame({"1": s1, "2": s2}) print(df) 1 2 0 1 4 1 2 5 2 3 6# 通过字典创建 # 可以通过columns属性指定列的顺序 df = pd.DataFrame( { "id": [1, 2, 3], "name": ["孙笑川", "药水哥", "Giao哥"], "age": [33, 30, 33] } ) print(df) id name age 0 1 孙笑川 33 1 2 药水哥 30 2 3 Giao哥 332. 属性属性说明index行索引values值dtypes元素类型shape形状ndim维度size元素个数columns列标签loc[]显示索引，按行列标签索引或切片iloc[]隐式索引，按行列位置索引或切片at[]使用行列标签访问指定元素iat[]使用行列位置访问指定元素T行列转置print("行索引：", df.index) print("列标签", df.columns) print("值：", df.values) 行索引： RangeIndex(start=0, stop=3, step=1) 列标签 Index(['id', 'name', 'age'], dtype='object') 值： [[1 '孙笑川' 33] [2 '药水哥' 30] [3 'Giao哥' 33]]print("形状：", df.shape) print("维度：", df.ndim) print("数据类型：") print(df.dtypes) 形状： (3, 3) 维度： 2 数据类型： id int64 name object age int64 dtype: object# 行数据 # loc print(df.loc[1]) print("==================") # iloc print(df.iloc[1]) id 2 name 药水哥 age 30 Name: 1, dtype: object ================== id 2 name 药水哥 age 30 Name: 1, dtype: object# 列数据 print(df.loc[:, 'name']) print("==================") print(df.iloc[:, 1]) 0 孙笑川 1 药水哥 2 Giao哥 Name: name, dtype: object ================== 0 孙笑川 1 药水哥 2 Giao哥 Name: name, dtype: object# 获取指定元素 print(df.at[0, 'name']) print("==================") print(df.iat[0, 1]) print("==================") print(df.loc[0, 'name']) print("==================") print(df.iloc[0, 1]) 孙笑川 ================== 孙笑川 ================== 孙笑川 ================== 孙笑川# 行列转置 #print(df.T)# 获取单列数据 print(df['name']) print("==================") print(df.name) print("==================") column = df'name' print(column) print(type(column)) 0 孙笑川 1 药水哥 2 Giao哥 Name: name, dtype: object ================== 0 孙笑川 1 药水哥 2 Giao哥 Name: name, dtype: object ================== name 0 孙笑川 1 药水哥 2 Giao哥 <class 'pandas.core.frame.DataFrame'># 多列数据 print(df'name', 'age') name age 0 孙笑川 33 1 药水哥 30 2 Giao哥 33# 获取部分数据 print(df.head(2)) print("==================") print(df.tail(2)) i…

三、pandas-Series-案例
type: item
date: 2025-11-23T07:41:00+00:00
description: （1）学生成绩统计创建一个包含10名学生成绩的Series，成绩范围在50 - 100之间。计算平均分、最高分、最低分，并找出高于平均分的学生人数。import numpy as np import pandas as pd # 生成随机成绩 np.random.seed(1) scores = pd.Series(np.random.randint(50, 101, 10), index=['学生' + str(i) for i in range(1, 11)]) print(scores) 学生1 87 学生2 93 学生3 62 学生4 58 学生5 59 学生6 61 学生7 55 学生8 65 学生9 50 学生10 66 dtype: int32mean_score = scores.mean() print("平均分：", mean_score) print("最高分：", scores.max()) print("最低分：", scores.min()) print("成绩高于平均分的学生人数：", scores[scores > mean_score].count()) 平均分： 65.6 最高分： 93 最低分： 50 成绩高于平均分的学生人数： 3（2）温度数据分析给定某城市一周中每天的最高温度Series，计算温度超过30°的天数，平均温度，温度由高到低排序，并找出温度变化最大的两天import numpy as np import pandas as pd # 温度 temperature = pd.Series([28, 26, 33, 31, 32, 30, 27], index=['周一', '周二', '周三', '周四', '周五', '周六', '周日', ]) print(temperature) 周一 28 周二 26 周三 33 周四 31 周五 32 周六 30 周日 27 dtype: int64print("温度超过30°的天数：", temperature[temperature > 30].count()) print("平均温度：", round(temperature.mean(), 1)) # ascending=False 降序 temperature_sort = temperature.sort_values(ascending=False) print(temperature_sort) # 计算相邻两天的温度差值 temperature_diff = temperature.diff().abs() temperature_diff_sort = temperature_diff.sort_values(ascending=False) print("温度变化最大的两天：", temperature_diff_sort.index[:2].tolist()) 温度超过30°的天数： 3 平均温度： 29.6 周三 33 周五 32 周四 31 周六 30 周一 28 周日 27 周二 26 dtype: int64 温度变化最大的两天： ['周三', '周日']（3）股票价格分析给定某股票连续10个交易日的收盘价Series，计算每日收益率（当日收盘价/前日收盘价 - 1），找出收益率最高和最低的日期，计算波动率（收益率标准差）import numpy as np import pandas as pd prices = pd.Series([105.2, 103.1, 104.6, 102.9, 101.9, 106, 108.2, 105.1, 104.6, 102.9], index=pd.date_range('2025-10-01', periods=10)) print(prices) 2025-10-01 105.2 2025-10-02 103.1 2025-10-03 104.6 2025-10-04 102.9 2025-10-05 101.9 2025-10-06 106.0 2025-10-07 108.2 2025-10-08 105.1 2025-10-09 104.6 2025-10-10 102.9 Freq: D, dtype: float64print("收益率：") pct_change = prices.pct_change() print(pct_change) print("收益率最高的日期：", pct_change.idxmax()) print("收益率最低的日期：", pct_change.idxmin()) print("波动率：", pct_change.std()) 收益率： 2025-10-01 N…

二、pandas - Series
type: item
date: 2025-11-20T14:48:00+00:00
description: 1. 创建# 安装 pandas pip install pandasimport pandas as pd s = pd.Series([5, 1, 3, 2, 8, 10]) print(s) 0 5 1 1 2 3 3 2 4 8 5 10 dtype: int64# 自定义索引 s = pd.Series([5, 1, 3, 2, 8, 10], index=['A', 'B', 'C', 'D', 'E', 'F']) print(s) s = pd.Series([5, 1, 3, 2, 8, 10], index=[10, 20, 30, 40, 50, 60]) print(s) A 5 B 1 C 3 D 2 E 8 F 10 dtype: int64 10 5 20 1 30 3 40 2 50 8 60 10 dtype: int64# 自定义name（name用于描述这一列是干什么的） s = pd.Series([5, 1, 3, 2, 8, 10], index=[10, 20, 30, 40, 50, 60], name='成绩') print(s) 10 5 20 1 30 3 40 2 50 8 60 10 Name: 成绩, dtype: int64# 通过字典创建 s = pd.Series({'A': 10, 'B': 20, 'C': 30}) print(s) s1 = pd.Series(s, index=['A', 'C']) print(s1) A 10 B 20 C 30 dtype: int64 A 10 C 30 dtype: int642. 常用属性属性说明index索引（从0开始）values值dtype/dtypes元素的类型shape形状ndim维度size元素个数name名称loc[]显示索引，按标签索引或切片iloc[]隐式索引，按位置索引或切片at[]通过标签访问指定元素iat[]通过位置访问指定元素s = pd.Series([1, 2, 3, 4, 5], index=['A', 'B', 'C', 'D', 'E']) # index print(s.index) Index(['A', 'B', 'C', 'D', 'E'], dtype='object')# values print(s.values) [1 2 3 4 5]# shape ndim size print(s.shape, s.ndim, s.size) (5,) 1 5# name print(s.name) s.name = "测试" print(s.name) None 测试# loc[] 显示索引 print(s.loc['A']) # iloc[] 隐示索引 print(s.iloc[0]) # 同时也支持切片语法 print(s.loc['A':'C']) print(s.iloc[0:2]) 1 1 A 1 B 2 C 3 Name: 测试, dtype: int64 A 1 B 2 Name: 测试, dtype: int64# at 注：不支持切片语法 print(s.at['A']) # iat 注：不支持切片语法 print(s.iat[0]) 1 13. 访问数据的方式# 直接访问 # print(s[0]) 不建议这样使用，底层可能无法区分是取标签为0的值，还是取索引为0的值 print(s['A']) # 通过已设置的标签访问 1# 通过布尔索引访问 print(s[s<3]) A 1 B 2 Name: 测试, dtype: int64# head() 默认取前5行的数据 print(s.head()) s['F'] = 100 s['G'] = 200 print(s.head()) # tail() 默认取最后5行的数据 print(s.tail()) print("=======================") # 通过参数指定取几行的数据 print(s.head(2)) print("=======================") print(s.tail(3)) A 1 B 2 C 3 D 4 E 5 Name: 测试, dtype: int64 A 1 B 2 C 3 D 4 E 5 Name: 测试, dtype: int64 C 3 D 4 E 5 F 100 G 200 Name: 测试, dtype: int64 ======================= A 1 B 2 Name: 测试, dtype: int64 ======================= E 5 F 100 G 200 Name: 测试, d…

一、pandas
type: item
date: 2025-11-20T14:45:00+00:00
description: 一、概要1. 简介pandas 是Python数据分析工具链中最核心的库，可用于数据读取、清洗、分析、统计、输出等，适用于处理结构化数据（如表格型数据）。2. 核心设计理念标签化数据结构：提供带标签的轴灵活处理缺失数据：内置NaN处理机制智能数据对齐：自动按标签对齐数据IO工具：支持CSV、Excel、SQL等多种数据源时间序列处理：原生支持日期时间处理和频率转换特性SeriesDataFrame维度一维二维索引单索引行索引 + 列名数据存储同质化数据类型各列的数据类型可以不同类比Excel 单列Excel Sheet创建方式pd.Series([1, 2, 3])pd.DataFrame({'col': [1, 2, 3]})