数据分析和 Pandas
Pandas 是 Python 数据分析的核心库之一。它的数据处理和清洁功能非常强大,特别是在处理表格数据时。
安装
Pandas 是个第三方包,如果还没有安装,可以通过以下命令安装:
pip install pandas
使用 Pandas 功能先要导入:
import pandas as pd
下面示例代码,有些省略了导入过程了,测试时需要自行添加。
DataFrame 数据结构
在 Pandas 库中,最主要使用的数据结构是 DataFrame,它为数据处理和分析提供了强大且灵活的工具。DataFrame 是一个二维的、表格型的数据结构,非常类似于 SQL 数据库表或 Excel 电子表格。DataFrame 可以存储不同类型的列,如整数、浮点数、字符串等。这是使用 pandas 库,最为常用的数据类型,我们经常使用它来读取数据库中的数据,或者是读取 csv, tsv 等文件格式中的数据。
创建简单的 DataFrame
比如下面的程序:
import pandas as pd
# 创建一个 DataFrame
data = {'Name': ['范统', '夏建仁', '李拜天'],
'Age': [20, 21, 19]}
df = pd.DataFrame(data)
# 显示 DataFrame
print(df)
输出为:
Name Age
0 范统 20
1 夏建仁 21
2 李拜天 19
上面的示例程序,创建了一个名为 df 的 DataFrame,它有两列三行。
DataFrame 的列代表数据的特征或变量。每列在 DataFrame 中有一个列名(比如示例中的 Name 和 Age),这些列名 组成了 DataFrame 的列索引(Column Index)。不同列的数据可以有不同的数据类型,但每一列中的数据应该具有相同的数据类型,比如:整数、浮点数、字符串等。列可以通过列名来访问和操作。程序中可以动态地插入、删除修改列。
DataFrame 的行表示数据记录,每一行包含了一组相关的数据。每行在 DataFrame 中通过索引(Index)标识。行可以通过行号(位置)或索引(标签)来访问和操作。行号是自动生成的,从 0 开始,类似于 Python 列表或数组的索引。行也同样可动态地插入、删除修改列。索引是一个不可变序列,用于标识 DataFrame 的行。很多数据操作,比如数据对齐、合并、连接和分组等都会使用到索引。
索引
默认情况下,DataFrame 采用行号作为索引,但索引也可以是日期、字符串或其他数据。比如,上面的程序,在创建 DataFrame 对象时,如果传入一个 index 参数: index=['a', 'b', 'c']
,产生的对象就会使用 index 的数据作为索引。新的 DataFrame 数据就会是如下:
Name Age
a 范统 20
b 夏建仁 21
c 李拜天 19
我们也可以使用 set_index 方法把某一列或某几列数据设置为索引。比如 df.set_index('Name', inplace=True)
将会把 Name 列设置为索引,数据会变成:
Age
Name
范统 20
夏建仁 21
李拜天 19
创建空 DataFrame
我们可以调用 empty_df = pd.DataFrame()
创建一个空的 Dataframe,然后再向其添加数据。下面的代码创建了一个带格式的空 Datafrme:
import pandas as pd
# 定义列名和数据类型
data_types = {
'Name': 'object' # object通常用于字符串
'age': 'int64',
}
# 创建一个空的DataFrame
empty_df = pd.DataFrame(columns=data_types.keys()).astype(data_types)
查看 DataFrame 的信息
下面是一些常用的查看 DataFrame 的信息的方法,采用哪种方法取决于想要获取的信息类型。
-
查看DataFrame的形状:使用
.shape
属性可以快速查看DataFrame的行数和列数。df.shape
-
查看列数据类型:使用
.dtypes
属性可以查看DataFrame中每列的数据类型。df.dtypes
-
查看前几行:使用
.head(n)
方法可以查看DataFrame的前n行数据,默认是前5行。df.head()
-
查看概览信息:使用
.info()
方法可以查看DataFrame的概览信息,包括每列的 数据类型、非空值数量等。df.info()
-
描述性统计:使用
.describe()
方法可以生成每列的描述性统计摘要,包括均值、标准差、最小值、最大值等。df.describe()
其它数据结构
Pandas 也支持其它一些数据结构,但是使用频率远低于 DataFrame。所以其它数据类型就不多详述了,只用 Series 作为示例,简单说明一下:
Series 是一维 的标签化数组,可以容纳任何数据类型(整数、字符串、浮点数、Python 对象等)。每个 Series 对象都有一个索引,可以通过索引来访问数组中的单个数据项。Series 中的所有数据项必须属于同一数据类型。一旦创建,Series 的长度是固定的,不能改变。但是,可以改变里面的数据。Series 可以有一个轴标签,可以使用标签来访问数据。
import pandas as pd
# 创建一个 Series
s = pd.Series([1, 3, 5, 7, 9], index=['a', 'b', 'c', 'd', 'e'])
# 访问数据
print(s['c']) # 输出: 5
读写文件和数据库
Pandas 提供了多种功能强大的函数来读取不同类型的文件,使得数据导入变得简单高效。这些函数可以处理各种常见的数据格式,如 CSV、Excel、JSON、HTML 和 SQL 数据库等。
读写 CSV, TSV 文件
CSV(逗号分隔值) 和 TSV(制表符分隔值)文件是最常见的文本文件格式,用于存储表格数据。这些文件中,数据按照行列保存,CSV 格式的文件,每列数据间用逗号分隔,TSV 格式文件中,每列数据用制表符分隔。我们可以使用 pd.read_csv() 函数读取这两种文件,只需指定适当的分隔符即可。
pd.read_csv() 函数的参数包括:
- filepath_or_buffer: 文件的路径或类似文件的对象。
- sep: 字段分隔符,默认为,。
- header: 用作列名的行号,默认为 0 (第一行)。
- index_col: 用作行索引的列编号或列名。
- usecols: 返回的列的子集。
- dtype: 列 的数据类型。
假设我们有一个名为 data.tsv 的文件,内容如下:
Name Age City
杜其演 24 上海
宋外麦 19 北京
读取这个文件的代码将是:
df = pd.read_csv('data.tsv', sep='\t')
print(df)
因为这个数据文件有表头,也就是 Name Age City
,所以 header 参数采用默认值 0。如果文件中的数据没有表头,使用 header=None
作为参数即可。也可以再另外加一个参数 names=['Name', 'Age', 'City']
,这样就指定了读取的数据的列名。
上面程序的输出是:
Name Age City
0 杜其演 24 上海
1 宋外麦 19 北京
把表格数据写入文本文件,与读取非常类似,使用 pd.to_csv() 函数。这个函数的参数也与 pd.read_csv() 函数的参数类似:
- path_or_buf:文件路径或一个类似文件的对象。如果未指定路径,结果将返回为字符串。
- sep:字段间的分隔符,默认为逗号 ','。
- index:是否将行索引写入文件,默认为 True。通常设置为 False,除非你需要行索引作为数据的一部分。
- header:是否写入列名(表头),默认为 True。
- columns:指定要写入文件的列名列表。
- encoding:指定文件的编码格式,默认是 'utf-8'。
假设把上面读取的数据在存入一个 CSV 文件中,调用下面这行程序即可:
df.to_csv('my_data.csv', index=False)
读写 Excel 文件
使用 Pandas ,读写 Excel 文件非常简单。但是 Pandas 本身并不能解析 Excel,它也是调用其它库来读写 Excel 的。所以,我们需要安装以下这些库:
# 用于处理 .xlsx 文件
pip install pandas openpyxl
# 用于处理 .xls 文件
pip install pandas xlrd
之后,就可以使用 to_excel() 和 read_excel() 函数来写入和读取 .xls和 .xlsx 格式的文件。这两个函数的参数与 to_csv(), read_csv() 函数非常类似。主要区别在于多了一个参数 sheet_name,用于指定工作表的名称,默认为 "Sheet1"。下面是一个简单示例:
import pandas as pd
# 创建一个示例 DataFrame
data = {'Name': ['姜米调', '高丽黛', '钱泰少'],
'Age': [25, 30, 35],
'City': ['上海', '北京', '西安']}
df = pd.DataFrame(data)
# 将 DataFrame 写入 Excel 文件
df.to_excel('my_data.xlsx', index=False)
# 读取名为 'Sheet1' 的工作表
df_2 = pd.read_excel('file.xlsx', sheet_name='Sheet1')
# 显示 DataFrame
print(df_2)
上面的程序把 DataFrame 数据写入了一个 Excel 文件,之后又把数据从文件里读入到了一个新的 DataFrame。
读写 SQL 数据库
使用 Pandas ,读写数据库也需要先安装所需 的模块:
pip install sqlalchemy pymysql pyhive
Pandas 使用 read_sql、read_sql_query 或 read_sql_table 函数来从数据库读取数据。首先,需要创建一个 SQLAlchemy 引擎对象,这个对象代表了数据库连接。
from sqlalchemy import create_engine
# 创建数据库引擎
# 示例为 SQLite 数据库,其他数据库的连接字符串格式可能不同
engine = create_engine('sqlite:///mydatabase.db')
# Hive 数据库代码类似: engine = create_engine('hive://hostname:port/database')
接下来使用 read_sql 函数或其变体从数据库中读取数据:
import pandas as pd
# 使用SQL查询
df = pd.read_sql("SELECT * FROM my_table", con=engine)
# 或者直接从表格读取
df = pd.read_sql_table("my_table", con=engine)
使用 to_sql 方法,可以将 DataFrame 的内容写入数据库表中:
df.to_sql("my_table", con=engine, if_exists='replace', index=False)
这里 if_exists 参数控制如果表已经存在时的行为,如果值为 'fail',表示如果表存在,抛出错误;'replace' 表示如果表存在,替换原有表;'append' 表示如果表存在,将数据添加到表中。
数据库的 URL 格式依赖于所使用的数据库类型。通常它包含用户名、密码、主机、端口和数据库名。将 DataFrame 写入数据库时,要确保 DataFrame 的结构与目标数据库表兼容。
读写其它类型文件
除了上面提到的几种数据文件和数据库,Pandas 还支持其它一些类型的文件,比如 JSON, HTML 等。但应用较少,就不详细介绍了。