pandas数据分析
数据的聚合与排序
Pandas 提供了很多聚合和排序函数来帮助我们对数据进行汇总和排序。聚合,就是对数据进行计算(比如说平均值等等)。示例代码:
import pandas as pd
data = {'Name':['Tom', 'Jack', 'Steve', 'Ricky'],'Age':[28,34,29,42],'Salary':[70000, 45000, 50000, 60000]}
df = pd.DataFrame(data)
# 计算年龄的平均值
print(df['Age'].mean())
# 按照薪资排序
print(df.sort_values(by='Salary'))
还有很多其他有用的函数和方法,可以用来操作和分析 DataFrame
数据。
head()
和tail()
:可以用来查看DataFrame
的前几行或后几行数据。
print(df.head()) # name age occupation
# 0 Alice 25 Engineer
# 1 Bob 30 Doctor
# 2 Charlie 35 Teacher
# 3 Dave 40 Lawyer
print(df.tail()) # name age occupation
# 0 Alice 25 Engineer
# 1 Bob 30 Doctor
# 2 Charlie 35 Teacher
# 3 Dave 40 Lawyer
mean()
:可以用来计算DataFrame
的平均值,默认情况下会对每一列计算平均值,但是我们也可以指定计算某一行或某一列的平均值。
print(df.mean()) # age 32.5
# dtype: float64
print(df.mean(axis=1)) # 0 25.333333
# 1 30.333333
# 2 35.333333
# 3 40.333333
# dtype: float64
unique()
:可以用来查看DataFrame
中某一列的不同元素,以及这些元素出现的次数。
print(df['occupation'].unique()) # ['Engineer' 'Doctor' 'Teacher' 'Lawyer']
print(df['occupation'].value_counts()) # Engineer 1
# Teacher 1
# Lawyer 1
# Doctor 1
# Name: occupation, dtype: int64
常用的聚合函数有:
常用的排序函数有:
sort_values()
:按照某个列或多列的值排序,这个是最常用的排序方法,可以指定按照哪一列排序,默认为升序,也可以设置为降序。sort_index()
:按照索引排序,这个是按照索引来排序的。
数据的读取与引用
Python 中可以使用 pandas 的 read_* 函数来读取各种格式的数据,例如:
read_csv() 读取 CSV 格式的数据
read_excel() 读取 Excel 格式的数据
read_json() 读取 JSON 格式的数据
read_html() 读取 HTML 格式的数据
可以使用 pandas 的 to_* 函数来保存数据,例如:
to_csv() 保存为 CSV 格式
to_excel() 保存为 Excel 格式
to_json() 保存为 JSON 格式
to_html() 保存为 HTML 格式
分析excel数据
pandas可以分析excel中的数据,新建一个test.xlsx,并添加如下数据:
读取excel数据
使用pandas中的read_excel
函数获取test.xlsx
read_excel
的参数为:
def read_excel(
io,
sheet_name: str | int | list[IntStrT] | None = 0,
*,
header: int | Sequence[int] | None = 0,
names: list[str] | None = None,
index_col: int | Sequence[int] | None = None,
usecols: int
| str
| Sequence[int]
| Sequence[str]
| Callable[[str], bool]
| None = None,
dtype: DtypeArg | None = None,
engine: Literal["xlrd", "openpyxl", "odf", "pyxlsb"] | None = None,
converters: dict[str, Callable] | dict[int, Callable] | None = None,
true_values: Iterable[Hashable] | None = None,
false_values: Iterable[Hashable] | None = None,
skiprows: Sequence[int] | int | Callable[[int], object] | None = None,
nrows: int | None = None,
na_values=None,
keep_default_na: bool = True,
na_filter: bool = True,
verbose: bool = False,
parse_dates: list | dict | bool = False,
date_parser: Callable | lib.NoDefault = lib.no_default,
date_format: dict[Hashable, str] | str | None = None,
thousands: str | None = None,
decimal: str = ".",
comment: str | None = None,
skipfooter: int = 0,
storage_options: StorageOptions = None,
dtype_backend: DtypeBackend | lib.NoDefault = lib.no_default,
) -> DataFrame | dict[IntStrT, DataFrame]:
常用的一些参数说明:
io
:读取excel的文件路径sheet_name
:excel的Sheet,输入字符串则读取sheet名,输入int则读取第几个sheet(从0开始)header
:用第几行作为表头,默认header=0,即默认第一行为表头engine
:读取excel时使用的引擎可以接受的参数有xlrd
,openpyxl
或odf
,用于使用第三方的库去解析excel文件。skiprows
:跳过指定的行nrows
:指定需要读取前多少行,通常用于较大的数据文件中。keep_default_na
:表示导入数据时是否导入空值。
举个例子:
excel = pd.read_excel("test.xlsx", sheet_name="test",engine="openpyxl")
print(excel)
这里的返回的是DataFrame
对象,返回的结果是:
A B C
0 11 21 31
1 12 22 32
2 13 23 33
3 14 24 34
4 15 25 35
5 16 26 36
6 17 27 37
值得注意的是,pandas中2.x
的版本调用read_excel
需要特别指定engine,使用openpyxl
引擎需要安装openpyxl
,使用xlrd
引擎需要安装xlrd
,特别是xlrd在大于2.0的版本后,只支持xls
的excel格式,所以使用openpyxl引擎,如果报错,请注意excel是否正常运行。
返回DataFrame
对象后,首行即是索引,即可使用DataFrame
的方法来分析数据。
保存excel数据
使用 pandas 保存数据到 Excel 文件非常简单,可以使用 DataFrame 的to_excel()
函数。参数如下:
def to_excel(
self,
excel_writer,
sheet_name: str = "Sheet1",
na_rep: str = "",
float_format: str | None = None,
columns: Sequence[Hashable] | None = None,
header: Sequence[Hashable] | bool_t = True,
index: bool_t = True,
index_label: IndexLabel = None,
startrow: int = 0,
startcol: int = 0,
engine: str | None = None,
merge_cells: bool_t = True,
inf_rep: str = "inf",
freeze_panes: tuple[int, int] | None = None,
storage_options: StorageOptions = None,
) -> None:
常用的一些参数说明:
excel_writer
:写入excel的文件路径sheet_name
:写入excel的Sheetcolumns
:指定输出某些列,用列表指定,比如columns = [“Name”, “Age”]
header
:是否保存头行列名,默认Trueindex
:是否保存索引列,默认Truestartrow
:写入的起始行startcol
:写入的起始列engine
:写入excel时使用的引擎。可以是openpyxl
或xlsxwriter
。
示例代码:
import pandas as pd
data = {'Name':['Tom', 'Jack', 'Steve', 'Ricky'],'Age':[28,34,29,42]}
df = pd.DataFrame(data)
df.to_excel('test.xlsx', sheet_name='Sheet1', index=False)
需要注意的是,在使用 to_excel() 保存数据到 Excel 文件时,需要安装 openpyxl 或 xlsxwriter 库,可以使用 pip 安装,命令如下:
pip install openpyxl
pip install xlsxwriter
这样就能保存数据到Excel文件了。
分析数据库数据
pandas也可以分析数据库中的数据,以mysql为例子,要使用pandas进行MySQL数据分析,首先需要安装MySQL驱动程序和pandas库。
对于MySQL驱动程序,可以使用Python标准库中的mysql-connector-python
库,或使用第三方库PyMySQL
。
以PyMySQL
为例,安装PyMySQL
完成后,就可以使用以下代码连接到MySQL数据库并执行查询:
import pandas as pd
import pymysql
# 使用PyMySQL连接数据库
cnx = pymysql.connect(user='<username>',password='<password>',host='<host>',database='<database>')
# 执行SQL查询
query = "SELECT * FROM table"
df = pd.read_sql(query, cnx)
print(df)
# 关闭数据库连接
cnx.close()
在上述代码中,需要将<username>
、<password>
、<host>
和<database>
替换为实际的MySQL用户名、密码、主机名和数据库名。
然后,使用pandas的read_sql()
函数执行SQL查询,将查询结果保存到一个名为df
的DataFrame
中。接下来,就可以使用pandas的各种功能进行数据分析了。如果有提示warning,这是pandas需要另外一个引擎的警告,可以找到read_sql
源码中的第759行到765行,注释它就不会出现warning了
然后可以使用 pandas 的 to_sql() 函数来保存数据到 MySQL 数据库。语法格式如下:
DataFrame.to_sql(name, con, if_exists='fail', index=True, index_label=None, chunksize=None, dtype=None)
其中:
name:数据表名
con: 数据库连接对象,可以是pymysql或者SQLAlchemy
if_exists: 如果表存在,可以是 'fail', 'replace', 'append' 中的一个。默认为 'fail'
index: 是否保存 DataFrame 的索引,默认为 True
index_label: 索引列的列名,默认为 None
chunksize: 每次插入的记录数,默认为 None
dtype: 指定列的数据类型,默认为 None
示例代码:
import pymysql
import pandas as pd
# 创建连接
conn = pymysql.connect(host='host', port=3306, user='username', password='password', db='database')
data = {'Name':['Tom', 'Jack', 'Steve', 'Ricky'],'Age':[28,34,29,42]}
df = pd.DataFrame(data)
df.to_sql('employee', conn, if_exists='append', index=False, method='multi')
# 关闭连接
conn.close()
这样就能把 DataFrame 中的数据保存到 MySQL 数据库的 employee 表中了。需要注意的是,使用 pymysql 引擎保存数据时,如果表不存在会报错,需要在代码中先创建表。
相关性分析
在Pandas中进行相关性分析是一种常见的数据分析方法,用于评估数据集中不同变量之间的相互关系。
Pandas的corr()
函数可以用来计算DataFrame中各列之间的相关系数。具体如下:
df.corr(method='pearson', min_periods=1)
method (可选): 字符串类型,用于指定计算相关系数的方法。有以下三种参数:
pearson
:皮尔逊相关系数,默认,衡量的是两个连续变量间线性关系的强度和方向。其计算基于变量间的协方差除以各自标准差的乘积。当两个变量都近似服从正态分布,并且我们关心的是它们之间的线性关系时,Pearson相关系数最为适用。例如,在研究身高与体重的关系时,如果数据点大致呈直线分布,使用Pearson相关系数会非常合适。
kendall
:Kendall秩相关系数是一种非参数统计方法,用于评估两个变量的排序关系,而不是它们的精确数值。它通过比较变量对的“一致”对数和“不一致”对数来计算,公式较为复杂,但核心思想是看一个变量中的顺序变化是否与另一个变量中的顺序变化趋势一致。Kendall系数特别适合于数据集中含有许多相同值(即“领结”现象)或者数据间可能存在非线性关系的情况。它对异常值的敏感度较低,适用于探索变量间是否存在单调关系,而不要求这种关系是线性的。spearman
:Spearman秩相关系数也是基于排序的非参数方法,但它首先将原始数据转化为各自的排序位置(即秩),然后计算这些秩之间的相关性,通常也是采用Pearson相关系数的方式处理这些秩。计算公式与Pearson相似,但应用于变量的秩而不是原始值。Spearman系数适用于数据分布不均匀或存在非线性关系的情况,特别是当变量的精确数值不如它们之间的相对大小重要时。它同样能够容忍一定程度的异常值影响,因为关注的是变量值的相对排名而非绝对值。Spearman比Kendall更适用于变量间可能有较强单调关系但不严格线性的情况,且对样本量较大的数据集表现更好。
min_periods (可选): 表示计算相关系数时所需的最小观测值数量。默认值是 1,即只要有至少一个非空值,就会进行计算。如果指定了 min_periods
,并且在某些列中的非空值数量小于该值,则相应列的相关系数将被设为 NaN。
代码示例如下:
import pandas as pd
# 假设df是你的DataFrame
df = pd.DataFrame({
'A': [1, 2, 3, 4, 5],
'B': [2, 3, 4, 5, 6],
'C': [5, 4, 3, 2, 1]
})
# 计算Pearson相关系数,默认方法
correlation_matrix = df.corr()
# 如果你想使用Spearman或Kendall方法
# correlation_matrix = df.corr(method='spearman')
# correlation_matrix = df.corr(method='kendall')
print(correlation_matrix)
输出:
A B C
A 1.0 1.0 -1.0
B 1.0 1.0 -1.0
C -1.0 -1.0 1.0
相关性可视化
在Pandas中计算了相关性矩阵后,使用Seaborn库的heatmap
函数进行可视化是一种非常直观的方式
首先安装seaborn
pip install seaborn
示例:
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
# 假设df是你的DataFrame
df = pd.DataFrame({
'A': [1, 2, 3, 4, 5],
'B': [2, 3, 4, 5, 6],
'C': [5, 4, 3, 2, 1]
})
correlation_matrix = df.corr()
# 绘制热力图
plt.figure(figsize=(10, 8)) # 设置图形大小
sns.heatmap(correlation_matrix, annot=True, fmt=".2f", cmap='coolwarm', square=True, linewidths=.5, cbar_kws={"shrink": .5})
plt.title('Correlation Matrix Heatmap') # 添加标题
plt.show()
pandas图表绘制
pandas 的 DataFrame
对象内置了对 Matplotlib 的集成,使得数据可视化变得直接而简便。通常来说,pandas的序列可以导入到plt的plot函数进行绘制,但DataFrame
对可以直接调用plot()
函数,并通过kind
参数绘制不同的图表类型
调用plot()
函数也可以使用plt进行图表样式的修改,像这样:
import pandas as pd
import matplotlib.pyplot as plt
# 示例数据
data = {
'Date': pd.date_range(start='2023-01-01', periods=10),
'Sales': [120, 150, 180, 200, 220, 250, 230, 270, 290, 300]
}
# 创建 DataFrame
df = pd.DataFrame(data)
# 使用 Matplotlib 绘制销量随日期变化的折线图
plt.figure(figsize=(10, 5)) # 设置图表尺寸
df.plot(x='Date', y='Sales', kind='line') # kind='line' 表示绘制折线图
# 添加标题和轴标签
plt.title('Product Sales Over Time')
plt.xlabel('Date')
plt.ylabel('Sales')
# 显示图表
plt.show()
折线图(line
)
df.plot(kind='line', x='column_name_x', y='column_name_y')
这是最基本的图表类型,用于显示数据随时间或其他连续变量的变化趋势。
柱状图
df.plot(kind='bar', x='column_name_x', y='column_name_y')
柱状图适用于比较不同类别的数量或频率。
堆积柱状图(barh
为水平堆积,bar stacked
为垂直堆积)
df.plot(kind='barh', stacked=True)
堆积柱状图可以展示每个类别内各个部分所占的比例。
直方图 (hist
)
df['column_name'].plot(kind='hist', bins=10)
直方图用于展示数值型数据的分布情况,常用于频率统计。
散点图 (scatter
)
df.plot(kind='scatter', x='column_name_x', y='column_name_y')
散点图用于展示两个变量之间的关系,适合探索相关性。
箱线图 (box
)
df.boxplot(column='column_name')
箱线图显示一组数据的五数概括(最小值、下四分位数、中位数、上四分位数、最大值),以及可能的异常值,适用于分析数据的集中趋势和离散程度。
面积图 (area
)
df.plot(kind='area')
面积图强调数据随时间变化的趋势,特别适合展示各部分总和随时间的变化。
密度图 (kde
, 即Kernel Density Estimate)
df.plot(kind='kde')
密度图显示数据的概率密度,对于理解连续变量的概率分布很有帮助。
图表样式定制
plot()
方法提供了丰富的定制选项,允许用户更细致地控制图表的外观
颜色(color)
df.plot(kind='line', color='blue') # 指定所有线条为蓝色
df.plot(kind='bar', color=['red', 'green']) # 柱状图中每根柱子指定不同的颜色
样式 (style)
df.plot(style='o--') # 线条样式为圆圈加虚线
图例 (legend)
df.plot(kind='line', legend=True) # 默认开启图例
df.plot(kind='line', label=['Series 1', 'Series 2']) # 为系列指定标签
标题与轴标签 (title, xlabel, ylabel)
ax = df.plot(kind='bar')
ax.set_title('My Chart Title')
ax.set_xlabel('X Axis Label')
ax.set_ylabel('Y Axis Label')
图表类型混合 (secondary_y)
df.plot(kind='line', y=['column1'], secondary_y=['column2'])
网格线 (grid)
df.plot(grid=True)
自定义轴范围 (xlim, ylim)
df.plot(xlim=(start, end), ylim=(bottom, top))
数据点标记 (marker)
df.plot(kind='line', marker='^') # 使用三角形作为标记
分面图 (subplots)
当DataFrame包含多个列时,可以为每个列创建子图
df.plot(subplots=True)