一、分组和聚合
1.1、 groupby
用于将 DataFrame 分割成多个组,以便可以对这些组应用聚合函数或执行其他操 作。
DataFrame.groupby(by=None, axis=0, level=None, as_index=True, sort=True, group_keys=True, observed=False, dropna=True)
描述 | 说明 |
---|---|
by | 用于确定分组依据。 |
axis | {0 或 ‘index’, 1 或 ‘columns’},默认为 0。这个参数决定了分组是在哪个轴 上进行。 |
level | 如果轴是多索引,则按指定的索引级别分组。 |
as_index | 布尔值,默认为 True。当为 True 时,分组名称将作为结果的索引; 如果为 False,则结果会保持原有的 DataFrame 结构,分组名称会作为一个普通 列出现。 |
sort | 布尔值,默认为 True。如果为 True,则对分组键进行排序;如果为 False,则不排序,保持原有的分组顺序。 |
group_keys | 布尔值,默认为 True。如果为 True,则将组键添加到聚合后的结 果中;如果为 False,则不添加。 |
observed | 布尔值,默认为 False。仅当分组依据是多索引且包含分类数据时适 用,如果为 True,则仅显示分类数据中的观察值。 |
dropna | 布尔值,默认为 True。如果为 True,并且by 是一个列表,则排除任何含有 NaN 的组。 |
import pandas as pd
import numpy as np
# 创建两个列表,它们将用作多级索引的级别
arrays = [['Falcon', 'Falcon', 'Parrot', 'Parrot'], # 第一级索引的值
['Captive', 'Wild', 'Captive', 'Wild']] # 第二级索引的值
# 使用arrays列表创建一个DataFrame,'Max Speed'列包含对应于多级索引的数据
df = pd.DataFrame({'Max Speed': [390., 350., 30., 20.]}, # 数据
index=arrays) # 使用arrays列表作为多级索引
# 打印原始DataFrame,以查看其结构和数据
print(df)
# 使用groupby方法按第一级索引(即'arrays'列表的第一个元素)分组
# level=0表示按照多级索引的第一级进行分组
res = df.groupby(level=1).mean() # 计算每个组(即每个不同的第一级索引值)的平均速度
# 打印分组后的平均值,显示每个动物的Max Speed的平均值
print(res)
Max Speed
Falcon Captive 390.0
Wild 350.0
Parrot Captive 30.0
Wild 20.0
Max Speed
Captive 210.0
Wild 185.0
1.2、 transform
对 DataFrame 或其中一个列应用一个函数,并返回一个与原始 DataFrame 具有相 同索引的对象。此方法不会更改原始 DataFrame,而是返回一个新的 DataFrame, 其中包含应用函数后的结果。
DataFrame.transform(func, axis=0, *args, **kwargs)
描述 | 说明 |
---|---|
func | 函数,应用于每个组或列。这个函数可以是一个内置函数,比如 numpy.mean,也可以是一个自定义函数。 |
axis | {0 或 ‘index’, 1 或 ‘columns’},默认为 0。这个参数决定了函数是在哪个轴 上应用: 如果 axis=0 或 axis='index',则函数按列应用。 如果 axis=1 或 axis='columns',则函数按行应用。 |
*args | 位置参数,将传递给 func。 |
**kwargs | 关键字参数,将传递给func |
import pandas as pd
import numpy as np
# 创建一个 DataFrame
df = pd.DataFrame({
'A': [1, 2, 3, 4, 5],
'B': [10, 20, 30, 40, 50],
'C': [100, 200, 300, 400, 500]
})
print(df)
def square(x):
return x ** 2
# 调用transform函数,并将自定义函数带入
transformed_df = df.transform(lambda x: x + x.sum(), axis=1)
print(transformed_df)
A B C
0 1 10 100
1 2 20 200
2 3 30 300
3 4 40 400
4 5 50 500
A B C
0 112 121 211
1 224 242 422
2 336 363 633
3 448 484 844
4 560 605 1055
1.3 、agg
它允许你应用一个或多个聚合函数到 DataFrame 的列或行上,并返回聚合后的结 果。
DataFrame.agg(func=None, axis=0, *args, **kwargs)
描述 | 说明 |
---|---|
func | 函数或函数列表/字典,应用于 DataFrame 的列或行。如果传递一个函 数,它将应用于所有列。如果传递一个函数列表或字典,则可以分别对不同的列 应用不同的函数。可以使用的函数包括 NumPy 的统计函数、Python 的内置函 数、Pandas 的自定义聚合函数,或者自定义的 lambda 函数。 |
axis | {0 或 ‘index’, 1 或 ‘columns’},默认为 0。这个参数决定了函数是在哪个轴 上应用: 如果 axis=0 或 axis='index',则函数按列应用。 如果 axis=1 或 axis='columns',则函数按行应用。 |
*args | 位置参数,将传递给 func。 |
**kwargs | 关键字参数,将传递给func |
import numpy as np
import pandas as pd
# 创建一个 DataFrame
df = pd.DataFrame({
'A': [1, 2, 3, 4, 5],
'B': [10, 20, 30, 40, 50]
})
print(df)
# 应用单个聚合函数,计算每列的平均值
result = df.agg('mean')
print(result)
# 对列 'A' 应用 'sum' 函数,对列 'B' 应用 'mean' 函数
result = df.agg({'A': 'sum', 'B': 'mean'})
print(result)
# 对所有列应用多个聚合函数
result = df.agg(['min', 'max', 'sum'])
print(result)
# 定义一个自定义函数
def custom_agg(x):
return (x.max() - x.min()) / x.std()
# 使用自定义函数进行聚合
result = df.agg(custom_agg)
print(result)
A B
0 1 10
1 2 20
2 3 30
3 4 40
4 5 50
A 3.0
B 30.0
dtype: float64
A 15.0
B 30.0
dtype: float64
A B
min 1 10
max 5 50
sum 15 150
A 2.529822
B 2.529822
dtype: float64
二、数据可视化
2.1、plot
用于绘制 DataFrame 数据图形,它允许用户直接从 DataFrame 创建各种类型的图 表,而不需要使用其他绘图库(底层实际上使用了 Matplotlib)。
DataFrame.plot(*args, **kwargs)
描述 | 说明 |
---|---|
kind | {‘line’, ‘bar’, ‘barh’, ‘hist’, ‘box’, ‘kde’, ‘density’, ‘area’, ‘pie’, ‘scatter’, ‘hexbin’},默认为 ‘line’。这个参数决定了要绘制哪种类型的图表。 |
ax | Matplotlib axes 对象,可选。如果提供,则绘图将在指定的 axes 对象上进 行。 |
subplots | 布尔值,默认为 False。如果为 True,则每个数值列将绘制在其自己 的子图中。 |
sharex | 布尔值,默认为 False。如果为 True,并且 subplots 为 True,则所 有子图共享相同的 x 轴。 |
sharey | 布尔值,默认为 False。如果为 True,并且 subplots 为 True,则所有子图共享相同的 y 轴。 |
layout | 元组(行数,列数),可选。用于安排子图的布局。 |
figsize | 元组(宽度,高度),可选。用于设置图表的大小。 |
use_index | 布尔值,默认为 True。如果为 True,则将 DataFrame 的索引用作 x 轴。 |
title | 字符串,可选。图表的标题。 |
grid | 布尔值,默认为 None。如果为 True,则在图表上显示网格线。 |
2.2、hist
用于绘制 DataFrame 中数据的直方图。
DataFrame.hist(column=None, by=None, grid=True, xlabelsize=None, xrot=None, ylabelsize=None, yrot=None, ax=None, sharex=False, sharey=False, figsize=None, layout=None, bins=10, backend=None, legend=False, **kwargs)
描述 | 说明 |
---|---|
column | 字符串或字符串列表,可选。用于指定要绘制直方图的列。如果未指 定,则默认绘制所有数值列的直方图。 |
by | 字符串或字符串列表,可选。用于指定分组变量,以便为每个组绘制直方 图。 |
grid | 布尔值,默认为 True。是否在直方图上显示网格线。 |
xlabelsize | 整数,可选。用于设置 x 轴标签的大小。 |
xrot | 浮点数,可选。用于设置 x 轴标签的旋转角度。 |
ylabelsize | 整数,可选。用于设置 y 轴标签的大小。 |
yrot | 浮点数,可选。用于设置 y 轴标签的旋转角度。 |
ax | Matplotlib axes 对象或数组,可选。如果提供,则在指定的 axes 对象上绘 制直方图。 |
sharex | 布尔值,默认为 False。如果为 True,并且绘制多个直方图,则所有直 方图共享相同的 x 轴。 |
sharey | 布尔值,默认为 False。如果为 True,并且绘制多个直方图,则所有直 方图共享相同的 y 轴。 |
figsize | 元组(宽度,高度),可选。用于设置整个图形的大小。 |
layout | 元组(行数,列数),可选。用于指定直方图的布局。 |
bins | 整数或序列,默认为 10。用于设置直方图的柱子数量或边界。 |
backend | 字符串,可选。用于指定绘图的后端。默认情况下,Pandas 使用 Matplotlib。 |
legend | 布尔值,默认为 False。如果为 True,并且指定了 by 参数,则在直方图上显示图例。 |
**kwargs | 关键字参数,这些参数会被传递给 Matplotlib 的 hist 函数,用于进 一步自定义直方图。 |
三、绘图
1、折线图与区域图
作用
- 显示趋势和变化:折线图适用于显示数据随时间、序列或其他连续变量的变化趋势。通过连接数据点形成线条,可以直观地观察数据的变化趋势,包括增长、下降、周期性等。
- 比较多个数据集:折线图可以同时显示多个数据集的趋势,以便进行比较和对比。通过将多个折线绘制在同一图表上,可以直观地比较不同数据集之间的差异和相似性。
- 发现异常值和波动:折线图可以帮助识别数据中的异常值和波动。通过观察折线图上的离群点、突变或震荡,可以发现数据中的异常情况,从而引发进一步的数据调查和分析。
- 预测和趋势分析:折线图可以用于预测和趋势分析。基于过去的数据,可以使用折线图来推断未来的趋势和模式,以支持决策制定和预测目标。
- 表达关联关系:折线图还可以显示不同数据集之间的关联关系。通过将相关的数据集绘制在同一图表上,并在折线之间进行比较,可以揭示变量之间的相关性和相互影响。
单条折线图
from matplotlib import pyplot as plt import numpy as np plt.rcParams['font.sans-serif'] = ['SimHei'] plt.rcParams['axes.unicode_minus'] = False data = {'年份': [2030, 2031, 2032, 2033, 2034], '销售额': [100, 150, 200, 180, 250]} df = pd.DataFrame(data) df.plot(x='年份', y='销售额', kind='line', title='年度销售额')
多条折线图
from matplotlib import pyplot as plt import numpy as np plt.rcParams['font.sans-serif'] = ['SimHei'] plt.rcParams['axes.unicode_minus'] = False data = {'年份': [2030, 2031, 2032, 2033, 2034], '销售额A': [100, 150, 200, 180, 250], '销售额B': [120, 160, 190, 210, 230]} df = pd.DataFrame(data) df.plot(x='年份', y=['销售额A', '销售额B'], kind='line', title='年度销售额')
区域图
from matplotlib import pyplot as plt import numpy as np plt.rcParams['font.sans-serif'] = ['SimHei'] plt.rcParams['axes.unicode_minus'] = False data = {'年份': [2030, 2031, 2032, 2033, 2034], '销售额': [100, 150, 200, 180, 250]} df = pd.DataFrame(data) df.plot(x='年份', y='销售额', kind='area', title='年度销售额')
堆叠区域图
from matplotlib import pyplot as plt import numpy as np plt.rcParams['font.sans-serif'] = ['SimHei'] plt.rcParams['axes.unicode_minus'] = False data = {'年份': [2030, 2031, 2032, 2033, 2034], '销售额A': [100, 150, 200, 180, 250], '销售额B': [120, 160, 190, 210, 230]} df = pd.DataFrame(data) df.plot(x='年份', y=['销售额A', '销售额B'], kind='area', stacked=True, title='年度销售额')
2、条形图与柱状图
作用
比较不同类别或组之间的大小或数量:柱状图是一种常用的工具,用于比较不同类别或组之间的大小、数量或频率。通过柱形的高度或长度,可以直观地看出各类别或组之间的差异,帮助我们进行比较和分析。
展示数据的分布情况:柱状图可以展示数据的分布情况,特别是离散型数据。每个柱形代表一个类别或组,其高度或长度表示该类别或组中的数据频率或数量,可以用于观察数据的分布模式。
强调特定数据点或子集:通过染色、添加标签或其他视觉效果,柱状图可以强调特定的数据点或数据子集,使其在整体数据中更加突出。
揭示趋势和模式:通过观察柱状图中不同类别或组的趋势和模式,可以发现数据中的某些趋势、关联或模式。例如,柱状图可以显示时间序列数据的趋势或季节性变化。
支持决策和传达见解:柱状图通常易于理解和解释,可以用于支持决策、传达见解和构建可视化故事。通过合理的布局、标签和注释,柱状图可以提供清晰的信息和观
垂直柱状图
from matplotlib import pyplot as plt import numpy as np plt.rcParams['font.sans-serif'] = ['SimHei'] plt.rcParams['axes.unicode_minus'] = False data = {'城市': ['北京', '上海', '广州', '深圳'], '人口': [2153, 2423, 1404, 1303]} df = pd.DataFrame(data) df.plot(x='城市', y='人口', kind='bar', title='城市人口')
堆叠柱状图
from matplotlib import pyplot as plt import numpy as np plt.rcParams['font.sans-serif'] = ['SimHei'] plt.rcParams['axes.unicode_minus'] = False data = {'城市': ['北京', '上海', '广州', '深圳'], '男性人口': [1050, 1190, 693, 646], '女性人口': [1103, 1233, 711, 657]} df = pd.DataFrame(data) df.plot(x='城市', kind='bar', stacked=True, title='城市人口性别分布')
分组柱状图
from matplotlib import pyplot as plt import numpy as np plt.rcParams['font.sans-serif'] = ['SimHei'] plt.rcParams['axes.unicode_minus'] = False data = {'城市': ['北京', '上海', '广州', '深圳'], '男性人口': [1050, 1190, 693, 646], '女性人口': [1103, 1233, 711, 657]} df = pd.DataFrame(data) df.plot(x='城市', kind='bar', position=0.5, title='城市人口性别分布')
水平柱状图
from matplotlib import pyplot as plt import numpy as np plt.rcParams['font.sans-serif'] = ['SimHei'] plt.rcParams['axes.unicode_minus'] = False data = {'城市': ['北京', '上海', '广州', '深圳'], '人口': [2153, 2423, 1404, 1303]} df = pd.DataFrame(data) df.plot(x='城市', y='人口', kind='barh', title='城市人口')
3、直方图
作用
数据分布的可视化:直方图可用于显示数据的分布情况。通过将数据划分为若干个等宽的区间(称为箱体),直方图展示了每个区间内的数据数量或频率,从而可以观察数据的分布模式,包括集中趋势、离散程度、偏斜度等。
数据间的比较:直方图可用于比较不同类别或组之间的数据。通过在同一图表中绘制多个直方图,可以直观地对比不同类别或组之间的数据分布情况,帮助观察差异、相似性和趋势。
发现异常值和异常模式:直方图可以帮助识别数据中的异常值和异常模式。通过观察直方图中的离群箱体或异常模式,可以发现数据中的异常情况,进而引发进一步的数据调查和分析。
数据预处理和特征工程:直方图在数据预处理和特征工程中起到重要的作用。通过观察数据的直方图,可以判断数据的分布是否符合要求,是否需要进行数据变换(如对数变换、归一化等)以满足建模的假设条件。
应用场景
数据分布的可视化和理解
比较不同类别或组之间的数据差异
发现数据中的异常值或异常模式
数据预处理和特征工程的探索性分析
垂直柱状图
import pandas as pd data = {'A': [1, 2, 2, 3, 3], 'B': [2, 3, 3, 4, 4]} df = pd.DataFrame(data) df.plot(kind='hist', stacked=True, title='堆叠直方图')
堆叠直方图
import pandas as pd data = {'A': [1, 2, 2, 3, 3], 'B': [2, 3, 3, 4, 4]} df = pd.DataFrame(data) df.plot(kind='hist', stacked=True, title='堆叠直方图')
分组直方图
import pandas as pd data = {'Category': ['A', 'A', 'B', 'B', 'B'], 'Value': [1, 2, 3, 4, 5]} df = pd.DataFrame(data) df.plot(kind='hist', by='Category', title='分组直方图')
4、饼图
作用
显示各类别占比:饼图可以用于显示不同类别在整体中的占比情况,通过扇区的面积或角度大小来表示不同类别的比例关系。
比较不同类别的大小:饼图可以用于比较不同类别的数据大小,通过比较扇区的大小来观察各类别之间的相对大小关系。
强调特定类别:通过突出显示特定扇区,饼图可以帮助强调或突出显示某个类别在整体中的重要性或特殊性。
数据分布的可视化:饼图可以展示数据的分布情况,特别适用于展示离散的分类数据
注意
饼图在某些情况下可能存在局限性,特别是在扇区过多或数据差异较小时,可能导致饼图难以解读。因此,在使用饼图时应谨慎选择数据和适当的展示方式,确保准确传达数据的含义
饼图常用的参数如下:
kind
:指定绘图类型,设置为'pie'
表示绘制饼图。
title
:设置图形的标题。
labels
:指定饼图每个扇区的标签。
autopct
:设置扇区上的百分比格式,可以显示每个扇区的百分比值。
'%.1f%%'
:显示一位小数的百分比值,例如 25.0%。
'%.2f%%'
:显示两位小数的百分比值,例如 25.00%。
'%.0f%%'
:显示整数的百分比值,例如 25%。
'%d'
:不显示百分比值,仅显示整数值。
None
:不显示任何值。
colors
:设置饼图扇区的颜色。
explode
:设置是否将某些扇区分离出来,突出显示。
shadow
:设置是否显示阴影效果。
startangle
:设置饼图的起始角度,以度数表示。
饼图
import pandas as pd data = {'类别': ['A', 'B', 'C', 'D'], '数值': [30, 20, 15, 35]} df = pd.DataFrame(data) df.plot(kind='pie', y='数值', labels=df['类别'], autopct='%.1f%%', title='饼图')
突出特定类别的饼图
import pandas as pd data = {'类别': ['A', 'B', 'C', 'D'], '数值': [30, 20, 15, 35]} df = pd.DataFrame(data) explode = [0.1, 0, 0, 0] # 突出显示第一个类别 df.plot(kind='pie', y='数值', labels=df['类别'], autopct='%.1f%%', explode=explode, title='突出特定类别的饼图')
不同颜色的饼图
import pandas as pd data = {'类别': ['A', 'B', 'C', 'D'], '数值': [30, 20, 15, 35]} df = pd.DataFrame(data) explode = [0.1, 0, 0, 0] # 突出显示第一个类别 df.plot(kind='pie', y='数值', labels=df['类别'], autopct='%.1f%%', explode=explode, title='突出特定类别的饼图')
5、箱图
作用
数据分布的可视化:箱图可以用于显示数据的分布情况,包括数据的集中趋势、离散程度和离群值情况。
离群值的检测:箱图可以帮助检测数据中的离群值,通过显示离群值的位置,帮助识别异常数据。
组间比较:可以通过绘制多个箱图,将不同组的数据进行比较,观察各组之间的差异和离群值情况。
注意
箱图适用于数值型数据,特别是在比较不同组之间的数据分布和离群值情况时非常有用。
然而,当数据集较大或数据分布高度倾斜时,可能需要结合其他图表或数据分析方法来更全面地理解数据。
在选择是否使用箱图时,应根据具体的数据和分析目标进行评估。
箱图常用的参数如下:
kind
:指定绘图类型,设置为'box'
表示绘制箱图。
title
:设置图形的标题。
vert
:设置箱图的方向,设置为True
表示垂直箱图,设置为False
表示水平箱图。
whis
:设置箱线图须与内限的位置,默认为 1.5。
showfliers
:设置是否显示离群值,默认为True
。
patch_artist
:设置是否使用补丁对象填充箱体,默认为False
。
meanline
:设置是否显示均值线,默认为False
。
meanprops
:设置均值线的属性,如颜色、线型等。
widths
:设置箱图的宽度,可以是数值或数组。
单个数据集的箱图
import pandas as pd data = {'数值': [10, 20, 30, 40, 50]} df = pd.DataFrame(data) df.plot(kind='box', title='Box Plot')
不同组之间的箱图比较
import pandas as pd data = {'组别': ['A', 'A', 'B', 'B', 'C', 'C'], '数值': [10, 15, 20, 25, 30, 35]} df = pd.DataFrame(data) df.boxplot(column='数值', by='组别')
水平箱图
import pandas as pd data = {'数值': [10, 20, 30, 40, 50]} df = pd.DataFrame(data) df.plot(kind='box', title='Horizontal Box Plot', vert=False)
显示离群值的箱图
import pandas as pd data = {'数值': [10, 20, 30, 40, 500]} df = pd.DataFrame(data) df.plot(kind='box', title='Box Plot with Outliers')
6、散点图
作用
变量关系的探索:散点图可以用于观察两个变量之间的关系,包括线性关系、非线性关系、正相关、负相关等。
数据分布的可视化:散点图可以显示数据点在二维平面上的分布情况,有助于理解数据的分布密度、离散程度和异常点。
趋势和模式的发现:通过绘制散点图,可以观察数据点的分布趋势、聚集模式和离群点,帮助发现数据中的规律和特征。
相关性分析:散点图可以用于评估两个变量之间的相关性,通过观察散点的分布,可以初步判断两个变量之间的相关关系
散点图常用的参数如下:
kind
:指定绘图类型,设置为'scatter'
表示绘制散点图。
x
:指定散点图的横轴数据列。
y
:指定散点图的纵轴数据列。
title
:设置图形的标题。
s
:设置数据点的大小。
c
:设置数据点的颜色。
单个颜色值:可以使用常见的颜色名称(如
'red'
、'blue'
)或颜色的十六进制表示(如'#FF0000'
、'#0000FF'
)来指定所有数据点的颜色。序列类型数据:可以传递一个与数据点数量相同的序列类型数据,用于为每个数据点指定单独的颜色。这可以是数字序列、字符串序列或颜色名称序列
marker
:设置数据点的标记形状。
'.'
:点标记。
'o'
:圆圈标记。
'x'
:叉标记。
'+'
:加号标记。
'*'
:星号标记。
'^'
:三角形标记。
's'
:正方形标记
单个数据集的散点图
import pandas as pd data = {'x': [1, 2, 3, 4, 5], 'y': [10, 20, 30, 40, 50]} df = pd.DataFrame(data) df.plot(kind='scatter', x='x', y='y', title='Scatter Plot')
根据数值设定散点大小和颜色
import pandas as pd data = {'x': [1, 2, 3, 4, 5], 'y': [10, 20, 30, 40, 50], 'size': [100, 200, 300, 400, 500], 'color': ['red', 'blue', 'green', 'yellow', 'orange']} df = pd.DataFrame(data) df.plot(kind='scatter', x='x', y='y', s=df['size'], c=df['color'], title='Scatter Plot with Size and Color')