当前位置: 首页 > 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.dtcms.com/a/335687.html

相关文章:

  • 智能汽车领域研发,复用云原始开发范式?
  • 笔记本电脑wifi小图标不见了 或者 蓝牙功能消失、电脑开不开机解决方法
  • 深入理解C#特性:从应用到自定义
  • CentOS启动两个MySQL实例
  • C#对象的本地保存与序列化详解笔记
  • [每周一更]-(第155期):Go 1.25 发布:新特性、技术思考与 Go vs Rust 竞争格局分析
  • 【前端面试题】前端面试知识点(第三十一题到第六十一题)
  • 项目发布上线清单
  • neo4j导入导出方法
  • 《设计模式》抽象工厂模式
  • 链表OJ题讲解---试金石含金量
  • RabbitMQ入门:生产者和消费者示例
  • Java注解学习记录
  • 什么是EDA(Exploratory Data Analysis,探索性数据分析)
  • AI出题人给出的Java后端面经(十七)(日更)
  • 第 463 场周赛(GPT-3,Me-1)
  • Foreign-Memory Access API外部内存API
  • 混沌工程(Chaos engineering):系统韧性保障之道
  • 计算机网络 HTTPS 全流程
  • p5.js 3D 形状 “预制工厂“——buildGeometry ()
  • 【位运算】查询子数组最大异或值|2693
  • 图灵完备(Turing Complete)免安装中文版
  • 关于pygsp引发的一系列问题和实例小demo
  • ​​Vue 3 开发速成手册
  • 裸机框架:按键模组
  • macos 安装nodepad++ (教程+安装包+报错后的解决方法)
  • AI证书怎么选
  • 交叉编译 手动安装 SQLite 库 移植ARM
  • 基于Vue + Node能源采购系统的设计与实现/基于express的能源管理系统#node.js
  • JavaScript 性能优化实战大纲