当前位置: 首页 > news >正文

Pandas数据结构详解Series与DataFrame

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.lryc.cn/news/624086.html

相关文章:

  • 【C#补全计划】多线程
  • 《解构WebSocket断网重连:指数退避算法的前端工业级实践指南》
  • 代码随想录刷题——字符串篇(五)
  • MySQL数据库初识
  • Linux 服务:iSCSI 存储服务配置全流程指南
  • 「数据获取」《中国文化文物与旅游统计年鉴》(1996-2024)(获取方式看绑定的资源)
  • ICCV 2025 | Reverse Convolution and Its Applications to Image Restoration
  • 一键管理 StarRocks:简化集群的启动、停止与状态查看
  • HTTP请求方法:GET与POST的深度解析
  • 【技术博客】480p 老番 → 8K 壁纸:APISR × SUPIR × CCSR「多重高清放大」完全指南
  • PCA 实现多向量压缩:首个主成分的深层意义
  • 平行双目视觉-动手学计算机视觉18
  • Go语言并发编程 ------ 锁机制详解
  • C++析构函数和线程退出1
  • C++继承(2)
  • Eclipse Tomcat Configuration
  • Docker-14.项目部署-DockerCompose
  • Docker入门:容器化技术的第一堂课
  • 飞算JavaAI赋能高吞吐服务器模拟:从0到百万级QPS的“流量洪峰”征服之旅
  • Linux软件编程:进程与线程(线程)
  • ruoyi-vue(十一)——代码生成
  • 最长回文子串问题:Go语言实现及复杂度分析
  • vulnhub-lampiao靶机渗透
  • 科目二的四个电路
  • 实时视频延迟优化实战:RTSP与RTMP播放器哪个延迟更低?
  • 机器学习--数据清洗
  • 音频分类标注工具
  • RAC环境redo在各节点本地导致数据库故障恢复---惜分飞
  • python pandas库 series如何使用
  • React 19 核心特性