Pandas数据结构详解:Series与DataFrame实战指南

前言

Pandas是Python数据分析的核心库,其强大的数据处理能力主要基于两种核心数据结构:SeriesDataFrame。本文将深入解析这两种数据结构的概念、创建方式、常用属性和方法,并通过丰富的实战案例帮助读者掌握Pandas的基础操作。

一、Series数据结构详解

1.1 Series概念与特点

Series是Pandas中的一维数据结构,可以理解为带标签的一维数组。每个Series对象包含两个主要组成部分:

  • 数据值(Values):一组值,支持NumPy的所有数据类型
  • 索引(Index):与数据值对应的标签,类似于字典的键

核心特点:

  • 类似于Excel中的一列数据
  • 支持通过标签访问数据
  • 自动创建从0开始的整数索引(如果未指定)

1.2 Series的创建方式

方式一:通过NumPy数组创建
import numpy as np
import pandas as pd# 创建ndarray对象
arr = np.array([1, 2, 3, 4, 5])
print(arr)  # [1 2 3 4 5]# 转换为Series对象
s1 = pd.Series(arr)
print(s1)
# 输出:
# 0    1
# 1    2
# 2    3
# 3    4
# 4    5
# dtype: int64
方式二:通过Python列表创建
# 直接传入列表
s2 = pd.Series([1, 2, 3, 4, 5])
print(s2)# 指定自定义索引
s3 = pd.Series([1, 2, 3, 4, 5], index=['a', 'b', 'c', 'd', 'e'])
print(s3)
# 输出:
# a    1
# b    2
# c    3
# d    4
# e    5
# dtype: int64
方式三:通过字典创建
# 字典的键自动成为索引
s4 = pd.Series({'a': 1, 'b': 2, 'c': 3, 'd': 4, 'e': 5})
print(s4)

1.3 Series的常用属性

# 创建示例Series
s = pd.Series([1, 2, 3, 4, 5], index=['a', 'b', 'c', 'd', 'e'])# 基本属性
print(s.dtype)      # 数据类型:int64
print(s.shape)      # 维度:(5,)
print(s.size)       # 元素个数:5
print(s.index)      # 索引:Index(['a', 'b', 'c', 'd', 'e'], dtype='object')
print(s.values)     # 值:array([1, 2, 3, 4, 5])
print(s.name)       # 名称:None

1.4 Series的常用方法

统计方法
s = pd.Series([1, 2, 3, 4, 2, 3], index=['a', 'b', 'c', 'd', 'e', 'f'])# 基础统计
print(s.count())    # 非空元素个数:6
print(s.sum())      # 总和:15
print(s.mean())     # 平均值:2.5
print(s.median())   # 中位数:2.5
print(s.mode())     # 众数:2, 3
print(s.std())      # 标准差:1.0488088481701516
print(s.var())      # 方差:1.1
print(s.min())      # 最小值:1
print(s.max())      # 最大值:4# 描述性统计
print(s.describe())
# 输出:
# count    6.000000
# mean     2.500000
# std      1.048809
# min      1.000000
# 25%      2.000000
# 50%      2.500000
# 75%      3.000000
# max      4.000000
# dtype: float64
数据操作方法
# 查看数据
print(s.head(3))    # 前3行
print(s.tail(3))    # 后3行# 排序
print(s.sort_values())                    # 按值升序
print(s.sort_values(ascending=False))     # 按值降序
print(s.sort_index())                     # 按索引升序# 去重和统计
print(s.unique())           # 唯一值:[1 2 3 4]
print(s.value_counts())     # 值计数:2    2, 3    2, 1    1, 4    1
print(s.drop_duplicates())  # 删除重复值

1.5 Series的布尔索引

# 读取科学家数据
df = pd.read_csv("data/scientists.csv")
ages_series = df['Age']# 计算平均年龄
mean_age = ages_series.mean()
print(f"平均年龄:{mean_age}")  # 59.125# 布尔索引筛选
older_scientists = ages_series[ages_series > mean_age]
print("年龄大于平均年龄的科学家:")
print(older_scientists)# 获取符合条件的完整信息
older_info = df[ages_series > mean_age][["Name", "Age"]]
print(older_info)

1.6 Series的运算操作

# Series与数值运算
ages_series = df['Age']
print(ages_series + 10)  # 每个年龄加10
print(ages_series * 2)   # 每个年龄乘2# Series与Series运算
print(ages_series + ages_series)  # 对应元素相加# 基于索引的运算
sorted_ages = ages_series.sort_values(ascending=False)
print(ages_series + sorted_ages)  # 按索引匹配运算

二、DataFrame数据结构详解

2.1 DataFrame概念与特点

DataFrame是Pandas中最核心的数据结构,可以理解为二维表格,类似于Excel工作表或SQL数据库表。

核心特点:

  • 二维表格结构(行和列)
  • 每列是一个Series对象
  • 所有列共享同一个行索引
  • 支持多种数据类型的列

2.2 DataFrame的创建方式

方式一:通过字典创建
# 基础字典创建
dict_data = {'name': ['张三', '李四', '王五'],'age': [18, 19, 20],'sex': ['男', '女', '男']
}df1 = pd.DataFrame(dict_data)
print(df1)
# 输出:
#    name  age sex
# 0  张三   18  男
# 1  李四   19  女
# 2  王五   20  男# 指定行索引
df2 = pd.DataFrame(dict_data, index=['a', 'b', 'c'])
print(df2)# 指定行索引和列索引
df3 = pd.DataFrame(dict_data, index=['a', 'b', 'c'], columns=['id', 'name', 'age', 'sex'])
print(df3)  # 不存在的列用NaN填充
方式二:通过CSV文件创建
# 读取CSV文件
df = pd.read_csv("data/scientists.csv")
print(df.head())# 指定索引列
df = pd.read_csv("data/scientists.csv", index_col='id')
print(df.head())

2.3 DataFrame的常用属性

df = pd.read_csv("data/scientists.csv")# 基本属性
print(df.index)     # 行索引
print(df.columns)   # 列名
print(df.values)    # 数据值
print(df.shape)     # 维度:(8, 5)
print(df.size)      # 元素个数:40
print(df.ndim)      # 维度数:2
print(df.dtypes)    # 每列的数据类型

2.4 DataFrame的常用方法

数据查看方法
print(df.head())        # 前5行
print(df.tail(3))       # 后3行
print(df.info())        # 数据信息
print(df.describe())    # 描述性统计# 按数据类型统计
print(df.describe(exclude=['object']))  # 排除字符串类型
print(df.describe(include='all'))       # 包含所有类型
数据筛选方法
# 布尔索引筛选
movie_df = pd.read_csv("data/movie.csv")
long_movies = movie_df[movie_df.duration > movie_df.duration.mean()]
print(long_movies[["director_name", 'duration']].head())# 多条件筛选
result = movie_df[(movie_df.duration > 120) & (movie_df.budget > 50000000)
]
print(result.head())

2.5 DataFrame的列操作

添加列
movie_df = pd.read_csv("data/movie.csv", index_col='movie_title')# 添加简单列
movie_df['has_seen'] = 0
print(movie_df.head())# 添加计算列
movie_df['director_actor_facebook_likes'] = (movie_df['director_facebook_likes'] +movie_df['actor_1_facebook_likes'] +movie_df['actor_2_facebook_likes'] +movie_df['actor_3_facebook_likes']
)
print(movie_df.head())
删除列
# 删除单列
movie_df.drop("has_seen", axis=1, inplace=True)# 删除多列
movie_df.drop(["actor_1_name", "actor_2_name", "actor_3_name"], axis=1, inplace=True)# 删除行
movie_df.drop("Avatar", axis=0, inplace=True)
插入列
# 在指定位置插入列
movie_df.insert(0, "profit", movie_df["gross"] - movie_df["budget"])
print(movie_df.head())

2.6 DataFrame的运算操作

# DataFrame与数值运算
print(df * 2)  # 每个元素乘2# DataFrame与DataFrame运算
print(df + df)  # 对应元素相加# 索引不匹配的运算
print(df + df[0:4])  # 不匹配的索引用NaN填充

三、实战案例分析

3.1 科学家数据分析

# 读取数据
scientists_df = pd.read_csv("data/scientists.csv")# 基础统计
print("科学家年龄统计:")
print(scientists_df['Age'].describe())# 按职业分组统计
occupation_stats = scientists_df.groupby('Occupation')['Age'].agg(['mean', 'count'])
print("\n各职业年龄统计:")
print(occupation_stats)# 筛选长寿科学家
long_lived = scientists_df[scientists_df['Age'] > 70]
print(f"\n年龄超过70岁的科学家:{len(long_lived)}人")
print(long_lived[['Name', 'Age', 'Occupation']])

3.2 餐厅小费数据分析

# 读取小费数据
tips_df = pd.read_csv("data/tips.csv")# 基础统计
print("小费数据分析:")
print(f"总账单平均:${tips_df['total_bill'].mean():.2f}")
print(f"小费平均:${tips_df['tip'].mean():.2f}")
print(f"小费比例:{tips_df['tip'].sum() / tips_df['total_bill'].sum() * 100:.1f}%")# 按性别分析
gender_tips = tips_df.groupby('sex')['tip'].agg(['mean', 'count'])
print("\n按性别分析小费:")
print(gender_tips)# 按星期分析
day_tips = tips_df.groupby('day')['tip'].mean().sort_values(ascending=False)
print("\n按星期分析平均小费:")
print(day_tips)

3.3 电影数据分析

# 读取电影数据
movie_df = pd.read_csv("data/movie.csv")# 计算利润率
movie_df['profit_margin'] = ((movie_df['gross'] - movie_df['budget']) / movie_df['budget'] * 100
)# 筛选盈利电影
profitable_movies = movie_df[movie_df['profit_margin'] > 0]
print(f"盈利电影数量:{len(profitable_movies)}")
print(f"盈利电影比例:{len(profitable_movies) / len(movie_df) * 100:.1f}%")# 按导演分析
director_stats = movie_df.groupby('director_name').agg({'profit_margin': 'mean','movie_title': 'count'
}).rename(columns={'movie_title': 'movie_count'})# 筛选多部电影的导演
top_directors = director_stats[director_stats['movie_count'] >= 3].sort_values('profit_margin', ascending=False)
print("\n多部电影导演的利润率排名:")
print(top_directors.head(10))

四、最佳实践与注意事项

4.1 性能优化建议

  1. 使用适当的数据类型:根据数据特点选择合适的数据类型
  2. 避免链式操作:减少中间变量的创建
  3. 使用向量化操作:避免使用循环,优先使用Pandas的内置方法

4.2 常见错误与解决方案

  1. SettingWithCopyWarning:使用.copy().loc避免链式索引
  2. 数据类型不匹配:注意数值运算时的数据类型转换
  3. 索引不匹配:确保运算时索引的一致性

4.3 代码规范

# 推荐的代码风格
import pandas as pd
import numpy as np# 读取数据
df = pd.read_csv("data.csv")# 数据预处理
df_clean = df.dropna().copy()# 数据分析
result = df_clean.groupby('category').agg({'value': ['mean', 'std', 'count']
})# 结果输出
print(result)

五、总结

本文详细介绍了Pandas的两种核心数据结构:Series和DataFrame。通过丰富的代码示例和实战案例,我们学习了:

  1. Series:一维带标签数组,支持多种创建方式和强大的统计方法
  2. DataFrame:二维表格结构,是数据分析的主要工具
  3. 数据操作:包括筛选、运算、列操作等常用功能
  4. 实战应用:通过真实数据集展示了数据分析的完整流程

掌握这些基础知识后,你将能够:

  • 高效地处理各种格式的数据
  • 进行基础的数据清洗和预处理
  • 执行描述性统计分析
  • 为更高级的数据分析任务打下坚实基础

Pandas的强大之处在于其丰富的生态系统和与其他数据科学库的无缝集成。建议读者在实际项目中多加练习,逐步掌握更多高级功能。


关键词:Pandas、Series、DataFrame、数据分析、Python、数据科学

相关推荐

  • NumPy基础入门实战指南
  • MySQL窗口函数与PyMySQL实战指南
  • 数据结构与算法基础

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/news/919246.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/919246.shtml
英文地址,请注明出处:http://en.pswp.cn/news/919246.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

TensorRT-LLM.V1.1.0rc0:在无 GitHub 访问权限的服务器上编译 TensorRT-LLM 的完整实践

一、TensorRT-LLM有三种安装方式,从简单到难 1.NGC上的预构建发布容器进行部署,见《tensorrt-llm0.20.0离线部署DeepSeek-R1-Distill-Qwen-32B》。 2.通过pip进行部署。 3.从源头构建再部署。 在实际开发中,我们常常面临这样的场景:本地笔记…

完整、可落地的 Elasticsearch 拼音补全配置模板 设计方案

在中文搜索场景中,用户经常使用拼音输入(如 “iPhone”、“pingguo”)来搜索中文内容(如“苹果手机”)。为了提升用户体验,Elasticsearch 可通过 拼音分词器 Completion Suggester 实现 拼音补全&#xff…

Redis面试精讲 Day 23:Redis与数据库数据一致性保障

【Redis面试精讲 Day 23】Redis与数据库数据一致性保障 在“Redis面试精讲”系列的第23天,我们将深入探讨Redis与数据库数据一致性保障这一在高并发分布式系统中极为关键的技术难题。该主题是面试中的高频压轴题,常出现在中高级后端开发、架构师岗位的考…

HTML <link rel=“preload“>:提前加载关键资源的性能优化利器

在网页性能优化中&#xff0c;“资源加载时机”是影响用户体验的关键因素——一个延迟加载的核心CSS可能导致页面“闪白”&#xff0c;一段未及时加载的关键JS可能让交互按钮失效。传统的资源加载方式&#xff08;如<link>加载CSS、<script>加载JS&#xff09;依赖…

WPF加载记忆上次图像

问题点使用MVVM先viewModel构造函数然后才Loaded事件,但Loaded事情时halcon控件没有加载完毕。Window_ContentRendered事件中halcon控件才有了句柄。解决问题1.viewModel函数中调用相机的类获取相机名(在这里是为了MVVM中以后可以做其它的事情如识别二维码)2.在Window_ContentR…

AT89C52单片机介绍

目录 1AT89C52原理图及结构框图 1.1 原理图 1.2 AT89C52 结构框图 1.2.1 8 位 CPU 1.2.2 存储器 1.2.3 I/O 端口 1.2.4 定时器 / 计数器 1.2.5 串行通信接口 1.2.6 中断系统 1.2.7 时钟与复位 1.2.8 总线结构 1.2.9 特殊功能寄存器区 2 AT89C52引脚介绍(PDIP) …

联网车辆功能安全和网络安全的挑战与当前解决方案

摘要在过去的二十年里&#xff0c;数字化重塑了我们的日常生活&#xff0c;汽车行业也身处这一变革之中。如今的车辆正变得日益智能且联网&#xff0c;具备了更多的安全和便捷功能&#xff08;如自动紧急制动、自适应巡航控制&#xff09;。下一代车辆将实现高度自动化乃至 5 级…

网络安全(Java语言)脚本 汇总(二)

文章目录目录遍历漏洞扫描器源代码思路一、核心功能二、依赖库三、核心流程四、关键方法五、数据结构六、输出信息目录遍历漏洞扫描器 源代码 /*** description : 目录遍历漏洞扫描器* 注意; 在输入URL时 要求必须保存 ?page 的末尾 才能保证路径合成的有效性*//*** desc…

基于 ArcFace/ArcMargin 损失函数的深度特征学习高性能人脸识别解决方案

要实现当前最先进的人脸识别系统,我们需要采用业界公认性能最佳的算法框架,主要包括基于 ArcFace/ArcMargin 损失函数的深度特征学习、MTCNN 人脸检测与对齐以及高效特征检索三大核心技术。以下是优化后的解决方案: 核心优化点说明 算法选择:采用 ArcFace(Additive Angul…

Sql server 查询每个表大小

在SQL Server中&#xff0c;你可以通过查询系统视图和系统表来获取数据库中每个表的大小。这可以通过几种不同的方式来实现&#xff0c;下面是一些常用的方法&#xff1a;方法1&#xff1a;使用sp_spaceused存储过程sp_spaceused是一个内置的存储过程&#xff0c;可以用来显示数…

react 错误边界

注意点&#xff1a; 类组件是可以和函数式组件混合写的&#xff01;&#xff01;&#xff01;getDerivedStateFromError是静态的&#xff0c;避免副作用&#xff0c;如果想将错误上报到服务器&#xff0c;则去componentDidCatch里去处理。getDerivedStateFromError直接返回{ ha…

自定义 VSCode 标题栏以区分不同版本

自定义 VSCode 标题栏以区分不同版本 当您在同一台计算机上使用多个 Visual Studio Code 版本时&#xff0c;自定义窗口标题栏是一个有效的方法&#xff0c;可以帮助您快速区分它们。 为何需要区分多个 VSCode 版本&#xff1f; 在同一台电脑上安装和使用多个 VSCode 实例是很常…

失败存储:查看未成功的内容

作者&#xff1a;来自 Elastic James Baiera 及 Graham Hudgins 了解失败存储&#xff0c;这是 Elastic Stack 的一项新功能&#xff0c;用于捕获和索引之前丢失的事件。 想获得 Elastic 认证吗&#xff1f;看看下一期 Elasticsearch Engineer 培训什么时候开始&#xff01; E…

基于Spring Boot+Vue的莱元元电商数据分析系统 销售数据分析 天猫电商订单系统

&#x1f525;作者&#xff1a;it毕设实战小研&#x1f525; &#x1f496;简介&#xff1a;java、微信小程序、安卓&#xff1b;定制开发&#xff0c;远程调试 代码讲解&#xff0c;文档指导&#xff0c;ppt制作&#x1f496; 精彩专栏推荐订阅&#xff1a;在下方专栏&#x1…

Node.js/Python 实战:封装淘宝商品详情 API 客户端库(SDK)

在开发电商相关应用时&#xff0c;我们经常需要与淘宝 API 交互获取商品数据。直接在业务代码中处理 API 调用逻辑会导致代码冗余且难以维护。本文将实战演示如何使用 Node.js 和 Python 封装一个高质量的淘宝商品详情 API 客户端库&#xff08;SDK&#xff09;&#xff0c;使开…

【Docker】关于hub.docker.com,无法打开,国内使用dockers.xuanyuan.me搜索容器镜像、查看容器镜像的使用文档

&#x1f527; 一、国内镜像搜索替代方案 国内镜像源网站 毫秒镜像&#xff1a;支持镜像搜索&#xff08;如 https://dockers.xuanyuan.me&#xff09;&#xff0c;提供中文文档服务&#xff08;https://dockerdocs.xuanyuan.me&#xff09;&#xff0c;可直接搜索镜像名称并…

2025盛夏AI热浪:八大技术浪潮重构数字未来

——从大模型革命到物理智能&#xff0c;AI如何重塑产业与人机关系&#x1f31f; 引言&#xff1a;AI从“技术爆炸”迈向“应用深水区」代码示例&#xff1a;AI商业化闭环验证模型# 验证AI商业化闭环的飞轮效应 def validate_ai_flywheel(compute_invest, app_adoption): re…

从希格斯玻色子到 QPU:C++ 的跨维度征服

一、引言&#xff1a;粒子物理与量子计算的交汇点在当代物理学和计算机科学的前沿领域&#xff0c;希格斯玻色子研究与量子计算技术的交汇正形成一个激动人心的跨学科研究方向。希格斯玻色子作为标准模型中最后被发现的基本粒子&#xff0c;其性质和行为对我们理解物质质量的起…

Elasticsearch:如何使用 Qwen3 来做向量搜索

在这篇文章中&#xff0c;我们将使用 Qwen3 来针对数据进行向量搜索。我们将对数据使用 qwen3 嵌入模型来进行向量化&#xff0c;并使用 Qwen3 来对它进行推理。在阅读这篇文章之前&#xff0c;请阅读之前的文章 “如何使用 Ollama 在本地设置并运行 Qwen3”。 安装 Elasticsea…

Mybatis实现页面增删改查

一、改变路由警告 二、实现新增数据 1.UserMapper.xml 2.Controller层 注意:前端传的是json对象,所以后台也需要使用JSON 3.设置提交的表单 <el-dialog title"信息" v-model"data.formVisible" width"30%" destroy-on-close><el-form…