Python---数据分析(Pandas十二:二维数组DataFrame分组和聚合,数据可视化函数,Pandas绘图:折线图,条形图,直方图,饼图,箱图,散点图)

一、分组和聚合

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’。这个参数决定了要绘制哪种类型的图表。
axMatplotlib 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 轴标签的旋转角度。
axMatplotlib 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、折线图与区域图

作用

  1. 显示趋势和变化:折线图适用于显示数据随时间、序列或其他连续变量的变化趋势。通过连接数据点形成线条,可以直观地观察数据的变化趋势,包括增长、下降、周期性等。
  2. 比较多个数据集:折线图可以同时显示多个数据集的趋势,以便进行比较和对比。通过将多个折线绘制在同一图表上,可以直观地比较不同数据集之间的差异和相似性。
  3. 发现异常值和波动:折线图可以帮助识别数据中的异常值和波动。通过观察折线图上的离群点、突变或震荡,可以发现数据中的异常情况,从而引发进一步的数据调查和分析。
  4. 预测和趋势分析:折线图可以用于预测和趋势分析。基于过去的数据,可以使用折线图来推断未来的趋势和模式,以支持决策制定和预测目标。
  5. 表达关联关系:折线图还可以显示不同数据集之间的关联关系。通过将相关的数据集绘制在同一图表上,并在折线之间进行比较,可以揭示变量之间的相关性和相互影响。

单条折线图

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、条形图与柱状图

作用

  1. 比较不同类别或组之间的大小或数量:柱状图是一种常用的工具,用于比较不同类别或组之间的大小、数量或频率。通过柱形的高度或长度,可以直观地看出各类别或组之间的差异,帮助我们进行比较和分析。

  2. 展示数据的分布情况:柱状图可以展示数据的分布情况,特别是离散型数据。每个柱形代表一个类别或组,其高度或长度表示该类别或组中的数据频率或数量,可以用于观察数据的分布模式。

  3. 强调特定数据点或子集:通过染色、添加标签或其他视觉效果,柱状图可以强调特定的数据点或数据子集,使其在整体数据中更加突出。

  4. 揭示趋势和模式:通过观察柱状图中不同类别或组的趋势和模式,可以发现数据中的某些趋势、关联或模式。例如,柱状图可以显示时间序列数据的趋势或季节性变化。

  5. 支持决策和传达见解:柱状图通常易于理解和解释,可以用于支持决策、传达见解和构建可视化故事。通过合理的布局、标签和注释,柱状图可以提供清晰的信息和观

 垂直柱状图

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、直方图

作用

  1. 数据分布的可视化:直方图可用于显示数据的分布情况。通过将数据划分为若干个等宽的区间(称为箱体),直方图展示了每个区间内的数据数量或频率,从而可以观察数据的分布模式,包括集中趋势、离散程度、偏斜度等。

  2. 数据间的比较:直方图可用于比较不同类别或组之间的数据。通过在同一图表中绘制多个直方图,可以直观地对比不同类别或组之间的数据分布情况,帮助观察差异、相似性和趋势。

  3. 发现异常值和异常模式:直方图可以帮助识别数据中的异常值和异常模式。通过观察直方图中的离群箱体或异常模式,可以发现数据中的异常情况,进而引发进一步的数据调查和分析。

  4. 数据预处理和特征工程:直方图在数据预处理和特征工程中起到重要的作用。通过观察数据的直方图,可以判断数据的分布是否符合要求,是否需要进行数据变换(如对数变换、归一化等)以满足建模的假设条件。

应用场景

  • 数据分布的可视化和理解

  • 比较不同类别或组之间的数据差异

  • 发现数据中的异常值或异常模式

  • 数据预处理和特征工程的探索性分析

 垂直柱状图

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、饼图

作用

  1. 显示各类别占比:饼图可以用于显示不同类别在整体中的占比情况,通过扇区的面积或角度大小来表示不同类别的比例关系。

  2. 比较不同类别的大小:饼图可以用于比较不同类别的数据大小,通过比较扇区的大小来观察各类别之间的相对大小关系。

  3. 强调特定类别:通过突出显示特定扇区,饼图可以帮助强调或突出显示某个类别在整体中的重要性或特殊性。

  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、箱图

作用

  1. 数据分布的可视化:箱图可以用于显示数据的分布情况,包括数据的集中趋势、离散程度和离群值情况。

  2. 离群值的检测:箱图可以帮助检测数据中的离群值,通过显示离群值的位置,帮助识别异常数据。

  3. 组间比较:可以通过绘制多个箱图,将不同组的数据进行比较,观察各组之间的差异和离群值情况。

注意

箱图适用于数值型数据,特别是在比较不同组之间的数据分布和离群值情况时非常有用。

然而,当数据集较大或数据分布高度倾斜时,可能需要结合其他图表或数据分析方法来更全面地理解数据。

在选择是否使用箱图时,应根据具体的数据和分析目标进行评估。

箱图常用的参数如下:

  • 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、散点图

作用

  1. 变量关系的探索:散点图可以用于观察两个变量之间的关系,包括线性关系、非线性关系、正相关、负相关等。

  2. 数据分布的可视化:散点图可以显示数据点在二维平面上的分布情况,有助于理解数据的分布密度、离散程度和异常点。

  3. 趋势和模式的发现:通过绘制散点图,可以观察数据点的分布趋势、聚集模式和离群点,帮助发现数据中的规律和特征。

  4. 相关性分析:散点图可以用于评估两个变量之间的相关性,通过观察散点的分布,可以初步判断两个变量之间的相关关系

散点图常用的参数如下:

  • 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')

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值