在数据科学和机器学习的世界里,Pandas 是我们的好伙伴!这个功能强大的 Python 库,为我们提供了诸多便利,帮助我们轻松地处理和分析海量数据。今天,就让我们一起探索 Pandas 的奥秘,品味数据分析的乐趣吧!
一、Pandas 数据结构:Series 与 DataFrame
Pandas 提供了两种重要的数据结构:Series 和 DataFrame。它们是 Pandas 的基石,让我们能够灵活地操作数据。
- Series
Series 是 Pandas 中的一维数据结构,它由两个主要部分组成:索引(index)和数据(values)。Series 的索引可以是任意类型,如整数、字符串、时间等,而数据则可以是整数、浮点数、字符串等各种数据类型。Series 的索引和数据之间存在一一对应的关系。
Series 数据结构的灵活性使其可以处理各种一维数据,如时间序列数据、一列数据等。此外,Series 支持许多类似于 NumPy 的操作,如数据筛选、切片、聚合等。我们可以通过字典、列表等 Python 数据结构创建 Series。
创建 Series 的例子:
import pandas as pd
# 使用列表创建 Series
data = [1, 2, 3, 4, 5]
s = pd.Series(data)
print(s)
输出:
0 1
1 2
2 3
3 4
4 5
dtype: int64
我们还可以自定义索引:
# 自定义索引
index = ['a', 'b', 'c', 'd', 'e']
s = pd.Series(data, index=index)
print(s)
输出:
a 1
b 2
c 3
d 4
e 5
dtype: int64
pd.Series()
函数用于创建 Series 对象。常用参数如下:
data
:传入一维数组、列表、字典等作为 Series 的数据。index
:用于指定 Series 的索引,默认为None
。如果不指定,系统会自动生成从 0 开始的整数索引。dtype
:指定 Series 的数据类型。如果不指定,系统会自动推断。name
:给 Series 命名。
示例:
import pandas as pd
data = [1, 2, 3, 4]
index = ['a', 'b', 'c', 'd']
s = pd.Series(data=data, index=index, dtype=int, name='example_series')
- DataFrame
DataFrame 是 Pandas 中的二维数据结构,可以看作是由多个 Series 按列组合而成的。DataFrame 由行索引(index)、列索引(columns)和数据(values)三部分组成。行索引和列索引可以是任意类型,如整数、字符串、时间等,数据则可以是整数、浮点数、字符串等各种数据类型。DataFrame 的行索引、列索引和数据之间存在一一对应的关系。
创建 DataFrame 的例子:
# 使用字典创建 DataFrame
data = {'name': ['Alice', 'Bob', 'Cathy', 'David', 'Eva'],
'age': [25, 30, 35, 40, 45],
'city': ['Beijing', 'Shanghai', 'Guangzhou', 'Shenzhen', 'Hangzhou']}
df = pd.DataFrame(data)
print(df)
输出:
name age city
0 Alice 25 Beijing
1 Bob 30 Shanghai
2 Cathy 35 Guangzhou
3 David 40 Shenzhen
4 Eva 45 Hangzhou
pd.DataFrame()
函数用于创建 DataFrame 对象。常用参数如下:
data
:传入二维数组、列表、字典、Series 等作为 DataFrame 的数据。index
:用于指定 DataFrame 的行索引,默认为None
。如果不指定,系统会自动生成从 0 开始的整数索引。columns
:用于指定 DataFrame 的列索引,默认为None
。如果不指定,系统会自动生成从 0 开始的整数索引。dtype
:指定 DataFrame 的数据类型。如果不指定,系统会自动推断。
示例:
import pandas as pd
data = {
'col1': [1, 2, 3],
'col2': [4, 5, 6],
'col3': [7, 8, 9]
}
index = ['row1', 'row2', 'row3']
columns = ['col1', 'col2', 'col3']
df = pd.DataFrame(data=data, index=index, columns=columns, dtype=int)
我们可以使用 head()
、tail()
、shape
等方法查看 DataFrame 的基本信息:
# 查看前 3 行数据
print(df.head(3))
# 查看后 2 行数据
print(df.tail(2))
# 查看 DataFrame 的形状(行数和列数)
print(df.shape)
DataFrame 是一个非常强大的数据结构,可以处理各种复杂的二维数据,如表格数据、多列数据等。DataFrame 支持许多高级的数据操作,如数据筛选、排序、分组、合并、透视表等。
Series 和 DataFrame 的设计灵感来源于 R 语言中的数据框(data.frame)概念。它们的设计初衷是为了方便处理各种复杂的数据处理任务,使数据处理变得更加简单、高效。在实际应用中,可以根据数据维度和需求选择使用 Series 或 DataFrame 进行数据处理。
二、Pandas 数据导入与导出
Pandas 支持多种数据格式的导入和导出,如 CSV、Excel、JSON、HTML、HDF5 等。这里,我们主要介绍 Pandas 中常用的 CSV 和 Excel 数据的导入和导出方法。
- CSV 数据
CSV(Comma-Separated Values)是一种以逗号分隔的纯文本数据格式,常用于存储表格数据。Pandas 提供了 read_csv()
和 to_csv()
函数来实现 CSV 数据的导入和导出。
导入 CSV 数据:
import pandas as pd
# 读取 CSV 文件
file_path = 'data.csv'
df = pd.read_csv(file_path)
# 显示前 5 行数据
print(df.head())
read_csv()
常用参数:
filepath_or_buffer
:文件路径(字符串)或类文件对象。sep
:字段分隔符,默认为逗号 ‘,’。header
:指定数据文件中的哪一行作为列名,默认为 0。如果没有列名,可以设置为None
。index_col
:指定哪一列作为 DataFrame 的索引,默认为None
。usecols
:指定要导入的列,可以是列名组成的列表,也可以是列索引的整数列表。nrows
:指定要读取的行数。skiprows
:跳过指定行数后再开始读取数据。encoding
:文件编码格式,默认为 ‘utf-8’。
导出 CSV 数据:
# 导出 DataFrame 到 CSV 文件
output_file_path = 'output_data.csv'
df.to_csv(output_file_path, index=False) # index=False 不保存索引列
to_csv()
常用参数:
path_or_buf
:文件路径(字符串)或类文件对象。sep
:字段分隔符,默认为逗号 ‘,’。header
:是否写入列名,默认为True
。index
:是否写入索引列,默认为True
。columns
:指定要导出的列。encoding
:文件编码格式,默认为 ‘utf-8’。
- Excel 数据
Excel 是一种常用的电子表格文件格式。Pandas 提供了 read_excel()
和 to_excel()
函数来实现 Excel 数据的导入和导出。需要注意的是,使用这两个函数需要先安装 openpyxl
和 xlrd
库。
安装所需库:
pip install openpyxl xlrd
导入 Excel 数据:
# 读取 Excel 文件
file_path = 'data.xlsx'
df = pd.read_excel(file_path)
# 显示前 5 行数据
print(df.head())
read_excel()
常用参数:
io
:文件路径(字符串)或类文件对象。sheet_name
:指定要读取的工作表名称或工作表索引。默认为 0,表示读取第一个工作表。header
:指定数据文件中的哪一行作为列名,默认为 0。如果没有列名,可以设置为None
。index_col
:指定哪一列作为 DataFrame 的索引,默认为None
。usecols
:指定要导入的列,可以是列名组成的列表,也可以是列索引的整数列表。nrows
:指定要读取的行数。skiprows
:跳过指定行数后再开始读取数据。
导出 Excel 数据:
# 导出 DataFrame 到 Excel 文件
output_file_path = 'output_data.xlsx'
df.to_excel(output_file_path, index=False) # index=False 不保存索引列
to_excel()
常用参数:
excel_writer
:文件路径(字符串)或类文件对象。sheet_name
:指定要写入的工作表名称,默认为 ‘Sheet1’。header
:是否写入列名,默认为True
。index
:是否写入索引列,默认为True
。columns
:指定要导出的列。
三、Pandas 数据处理与分析
接下来,让我们一起来看看 Pandas 是如何处理和分析数据的。以下是一些常见的数据操作:
- 数据筛选:
Pandas 提供了多种数据选择和筛选方法,如使用 []
、loc
、iloc
、at
和 iat
等进行数据访问。以下是一些常用函数及其参数:
[]
:使用列名或条件表达式进行数据筛选。loc
:基于行、列标签进行数据选择。iloc
:基于行、列索引进行数据选择。at
:使用行、列标签快速访问单个元素。iat
:使用行、列索引快速访问单个元素。
# 筛选年龄大于 25 岁的人
filtered_df = df[df['age'] > 25]
- 数据排序:
Pandas 支持对数据进行排序。常用的排序函数是 sort_values()
和 sort_index()
。
-
sort_values(by, axis=0, ascending=True, inplace=False, na_position='last')
:by
:指定需要排序的列名。axis
:指定排序轴(0 表示按行排序,1 表示按列排序)。ascending
:指定排序方式(True 表示升序,False 表示降序)。inplace
:是否在原 DataFrame 上进行排序。na_position
:指定缺失值的位置(‘last’ 表示放在最后,‘first’ 表示放在最前)。
-
sort_index(axis=0, level=None, ascending=True, inplace=False, na_position='last')
:axis
、ascending
、inplace
和na_position
参数同sort_values()
。level
:用于多层索引排序时,指定需要排序的索引层级。
# 按年龄排序
sorted_df = df.sort_values(by='age')
- 数据清洗
Pandas 提供了许多数据清洗功能,如处理缺失值、重复值、异常值等。以下是一些常用函数及其参数:
- 处理缺失值:
dropna(axis=0, how='any', thresh=None, subset=None, inplace=False)
:删除含有缺失值的行或列。axis
、inplace
参数同sort_values()
。how
:指定删除条件(‘any’ 表示只要有缺失值就删除,‘all’ 表示所有值都是缺失值才删除)。thresh
:指定非缺失值的最小数量,低于此数量的行或列将被删除。subset
:指定需要考虑的列。
fillna(value=None, method=None, axis=None, inplace=False, limit=None)
:填充缺失值。value
:指定用于填充的值。method
:指定填充方式(‘ffill’ 表示用前一个值填充,‘bfill’ 表示用后一个值填充)。axis
、inplace
参数同sort_values()
。limit
:指定连续缺失值的最大填充数量。
# 丢弃缺失值
df.dropna(axis=0, how='any', thresh=None, subset=None, inplace=False)
# 填充缺失值
df.fillna(value=0, method=None, axis=None, inplace=False, limit=None)
- 处理重复值:
duplicated(subset=None, keep='first')
:检测重复行。subset
:指定需要考虑的列。keep
:指定保留哪个重复行(‘first’ 表示保留第一个,‘last’ 表示保留最后一个,False 表示不保留任何重复行)。
drop_duplicates(subset=None, keep='first', inplace=False)
:删除重复行。subset
、keep
、inplace
参数同duplicated()
。
# 检测重复值
duplicates = df.duplicated(subset=None, keep='first')
# 删除重复值
df.drop_duplicates(subset=None, keep='first', inplace=False)
- 数据分组与聚合:
Pandas 提供了丰富的数据聚合与统计功能,如 groupby()
、agg()
、describe()
等。以下是一些常用函数及其参数:
-
groupby(by=None, axis=0, level=None, sort=True)
:按照指定条件进行分组。by
:指定用于分组的列名或函数。axis
、level
、sort
参数同sort_index()
。
-
agg(func=None, axis=0, *args, **kwargs)
:对分组后的数据应用聚合函数。func
:指定用于聚合的函数。axis
参数同sort_values()
。
-
describe(percentiles=None, include=None, exclude=None)
:生成描述性统计信息。percentiles
:指定计算的百分位数。include
:指定包含的数据类型。exclude
:指定排除的数据类型。
# 分组
grouped = df.groupby(by='A', axis=0, level=None, sort=True)
# 聚合函数
result = grouped.agg(func='sum', axis=0)
# 描述性统计信息
description = df.describe(percentiles=None, include=None, exclude=None)
- 数据合并:
# 合并两个 DataFrame
data2 = {'name': ['Alice', 'Bob', 'Cathy'],
'score': [90, 80, 85]}
df2 = pd.DataFrame(data2)
merged_df = pd.merge(df, df2, on='name')
这些只是 Pandas 提供的众多功能中的一部分。在实际应用中,我们可以根据需求灵活运用这些功能,进行数据的清洗、分析和可视化,为我们的数据科学项目提供强大的支持。
四、Pandas 与数据可视化
Pandas 本身提供了一些简单的数据可视化功能,主要依赖于 Matplotlib 库。对于更复杂的可视化需求,可以将 Pandas 的数据结构与其他可视化库(如 Seaborn、Plotly 等)结合使用。以下是一些常用的 Pandas 可视化函数及其参数:
- 线形图
DataFrame.plot.line(x=None, y=None, **kwds)
参数:
x
:指定 x 轴的列名。y
:指定 y 轴的列名。
示例:
import pandas as pd
import matplotlib.pyplot as plt
data = {'A': [1, 2, 3], 'B': [4, 5, 6]}
df = pd.DataFrame(data)
df.plot.line()
plt.show()
- 柱状图
DataFrame.plot.bar(x=None, y=None, **kwds)
参数:
x
:指定 x 轴的列名。y
:指定 y 轴的列名。
示例:
import pandas as pd
import matplotlib.pyplot as plt
data = {'A': [1, 2, 3], 'B': [4, 5, 6]}
df = pd.DataFrame(data)
df.plot.bar()
plt.show()
- 盒图
DataFrame.plot.box(**kwds)
示例:
import pandas as pd
import matplotlib.pyplot as plt
data = {'A': [1, 2, 3], 'B': [4, 5, 6]}
df = pd.DataFrame(data)
df.plot.box()
plt.show()
- 散点图
DataFrame.plot.scatter(x, y, s=None, c=None, **kwds)
参数:
x
:指定 x 轴的列名。y
:指定 y 轴的列名。s
:指定散点的大小。c
:指定散点的颜色。
示例:
import pandas as pd
import matplotlib.pyplot as plt
data = {'A': [1, 2, 3], 'B': [4, 5, 6]}
df = pd.DataFrame(data)
df.plot.scatter(x='A', y='B')
plt.show()
以上只是 Pandas 提供的部分可视化函数,实际上还有很多其他类型的图表,如饼图、直方图等。在实际应用中,可以根据需要选择合适的可视化方法。
import matplotlib.pyplot as plt
import seaborn as sns
# 绘制柱状图,显示每个城市的人数
city_count = df['city'].value_counts()
city_count.plot(kind='bar')
plt.xlabel('城市')
plt.ylabel('人数')
plt.show()
在这个例子中,我们使用 Pandas、Matplotlib 和 Seaborn 绘制了一个柱状图,展示了每个城市的人数。数据可视化让我们能够更直观地理解数据,为我们的数据分析工作提供了有力的支持。
总结:Pandas,数据分析的神奇利器
通过本文的学习,你已经掌握了 Pandas 的核心功能,包括数据结构、数据导入与导出、数据处理与分析以及数据可视化。Pandas 是数据科学家的得力助手,让我们在数据的海洋中畅游自如。希望你能在今后的学习和实践中,不断提高自己的 Pandas 技能,成为数据分析领域的佼佼者!
参考文献:
- Pandas 官方文档:https://pandas.pydata.org/docs/
- 《Python for Data Analysis》, 作者:Wes McKinney
- 《Python 数据科学手册》,作者:Jake VanderPlas