查看全课大纲(第 3 / 45 节)
- 1.课程简介
- 2.环境搭建
- 3.预备知识
- 4.pyecharts初体验
- 5.数据可视化概述
- 6.数据可视化的目标和作用
- 7.数据可视化工具对比分析
- 8.数据可视化基本流程
- 9.数据可视化设计原则
- 10.pyecharts简介
- 11.官方图表样例
- 12.常用图表的基本结构
- 13.数据格式
- 14.图表的分类
- 15.柱状图与条形图
- 16.其他对比图表
- 17.常用配置项(一)
- 18.常用配置项(二)
- 19.折线图 面积图
- 20.K线图
- 21.其他时间图表
- 22.常用配置项
- 23.散点图 气泡图
- 24.热力图
- 25.其他相关性图表
- 26.饼图
- 27.矩形树图
- 28.其他成分比例图表
- 29.箱型图与直方图
- 30.3D柱状图与折线图
- 31.其他统计图表
- 32.地图 Map
- 33.地理坐标系Geo
- 34.3D 地图
- 35.网络关系图
- 36.主题河流图
- 37.词云图
- 38.组合图表组件
- 39.仪表盘相关图表
- 40.项目介绍
- 41.数据准备
- 42.子图制作(一)
- 43.子图制作(二)
- 44.数据大屏制作
- 45.项目总结
预备知识
Pandas 数据处理基础与数据可视化准备
小象实战讲义 · ECharts 数据可视化
在数据可视化的旅程中,我们常常需要将分析结果转化为直观的图表。这个过程的第一步,往往是数据的读取、清洗与整理。本节课程将为你介绍 Python 数据分析的核心库——Pandas,它是连接你的数据分析成果与 ECharts 可视化图表之间的关键桥梁。掌握 Pandas 的基础操作,你将能高效地准备数据,为后续创建交互式图表、地图乃至数据大屏打下坚实基础。
💡 核心导读
- Pandas 的角色:理解 Pandas 作为强大的结构化数据处理工具集,在数据可视化流程中的定位。
- 核心数据结构:掌握
Series(一维数据)和DataFrame(二维表格)两种核心数据结构及其创建方式。 - 数据索引与操作:学会使用
loc、iloc和向量化操作高效地访问、筛选和计算数据。 - 数据读写:掌握从 CSV 文件读取数据,以及将处理后的数据保存为文件的基本方法。
- 数据格式转换:了解如何将 Pandas 的数据类型(如
Series)转换为 ECharts 所需的 Python 原生列表(list)格式。
一、Pandas 简介与结构化数据
Pandas 是 Python 数据分析的基石,由 Wes McKinney 于 2008 年创建。它建立在 NumPy 之上,提供了高性能的矩阵运算能力,其核心优势在于向量化操作——无需编写循环即可对整个数据序列进行计算,极大地提升了数据处理效率。
在数据可视化领域,我们处理的数据大多是结构化数据。这类数据具有清晰的行列结构,易于用表格表示,例如:
- 表格型数据:Excel 文件、CSV 文件。
- 半结构化数据:JSON 格式的数据。
与之相对的是非结构化数据,如图片、音频、视频等,它们没有固定的格式,难以直接用表格描述。本课程主要聚焦于结构化数据的可视化。
二、核心数据结构:Series
Series 是 Pandas 中最基本的数据结构,类似于带标签的一维数组。它由一组数据(values)和与之对应的索引(index)组成。
1. 创建 Series
我们可以通过 Python 列表或字典来创建 Series。
import pandas as pd
# 通过列表创建 Series
coins_list = ['比特币', '以太坊', '柚子币', 'USDT']
coins_series = pd.Series(coins_list)
print('数据类型:', type(coins_series))
print('Series 数据:')
print(coins_series)
print('索引:', coins_series.index)
print('值(NumPy数组):', coins_series.values)数据类型: <class 'pandas.Series'>
Series 数据:
0 比特币
1 以太坊
2 柚子币
3 USDT
dtype: str
索引: RangeIndex(start=0, stop=4, step=1)
值(NumPy数组): <StringArray>
['比特币', '以太坊', '柚子币', 'USDT']
Length: 4, dtype: str可以看到,未指定索引时,Pandas 会自动创建一个从 0 开始的整数索引。
# 通过字典创建 Series
coin_dict = {'BTH': '比特币', 'ETH': '以太坊', 'EOS': '柚子币'}
coin_dict_series = pd.Series(coin_dict)
print('通过字典创建的 Series:')
print(coin_dict_series)
print('索引:', coin_dict_series.index)通过字典创建的 Series:
BTH 比特币
ETH 以太坊
EOS 柚子币
dtype: str
索引: Index(['BTH', 'ETH', 'EOS'], dtype='str')此时,字典的键(key)自动成为了 Series 的索引。
2. 访问 Series 数据
访问 Series 中的数据有两种主要方式:
- 按位置访问:使用
iloc,基于整数位置。 - 按索引标签访问:使用
loc或直接使用中括号[]。
# 按位置访问 (iloc)
print('iloc[1]:', coin_dict_series.iloc[1]) # 获取第二个元素
# 按索引标签访问 (loc 或 [])
print("loc['ETH']:", coin_dict_series.loc['ETH'])
print("['ETH']:", coin_dict_series['ETH'])
# 访问多个不连续的数据(传入列表)
print('\n不连续访问(位置):')
print(coin_dict_series.iloc[[0, 2]]) # 第1个和第3个
print('\n不连续访问(标签):')
print(coin_dict_series.loc[['BTH', 'EOS']])iloc[1]: 以太坊
loc['ETH']: 以太坊
['ETH']: 以太坊
不连续访问(位置):
BTH 比特币
EOS 柚子币
dtype: str
不连续访问(标签):
BTH 比特币
EOS 柚子币
dtype: str3. 关键点:数据格式转换
ECharts(通过 pyecharts)在接收数据时,通常需要 Python 原生的列表(list)类型。数值型 Series 的 .values 返回 NumPy 数组(ndarray);pandas 3.x 中字符串列的 .values 返回 StringArray。为保证类型统一,推荐用 .tolist() 转换:
# 将 Series 的值转换为列表
values_list = coin_dict_series.values.tolist()
print('转换后的列表:', values_list)
print('列表类型:', type(values_list))转换后的列表: ['比特币', '以太坊', '柚子币']
列表类型: <class 'list'>这个转换步骤在后续将 Pandas 处理好的数据传递给 pyecharts 制作图表时至关重要。
三、核心数据结构:DataFrame
DataFrame 是 Pandas 中最常用、最重要的数据结构,可以看作是一个二维表格,类似于 Excel 工作表或 SQL 表。每一列的数据类型可以不同。
1. 创建 DataFrame
一个常见的创建方式是将多个 Series 组合成一个列表,然后传递给 pd.DataFrame()。
import pandas as pd
# 创建三个 Series,每个代表一行数据
coin1 = pd.Series({'Name': '比特币', 'Year': 2017, 'MaxPrice': 19798.68})
coin2 = pd.Series({'Name': '以太坊', 'Year': 2017, 'MaxPrice': 1440.00})
coin3 = pd.Series({'Name': '柚子币', 'Year': 2018, 'MaxPrice': 15.68})
# 将 Series 列表转换为 DataFrame,并指定行索引
df = pd.DataFrame([coin1, coin2, coin3], index=['BTH', 'ETH', 'EOS'])
print('DataFrame 预览:')
print(df)
print('\n数据类型:', type(df))DataFrame 预览:
Name Year MaxPrice
BTH 比特币 2017 19798.68
ETH 以太坊 2017 1440.00
EOS 柚子币 2018 15.68
数据类型: <class 'pandas.DataFrame'>在 Jupyter Notebook 中直接输出 df 会显示为更美观的表格样式,而 print(df) 则是纯文本格式。
2. 访问 DataFrame 数据
DataFrame 的索引包括行索引(index)和列索引(columns,也称 label)。
- 访问行:使用
loc(按标签)或iloc(按位置)。 - 访问列:直接使用列名,如
df[‘列名’]或df.列名(如果列名是有效的 Python 变量名)。
# 访问行(按标签)
print("行访问 loc['BTH']:")
print(df.loc['BTH'])
print(type(df.loc['BTH'])) # 返回一个 Series
# 访问行(按位置)
print("\n行访问 iloc[1]:")
print(df.iloc[1]) # 第二行
# 访问列
print("\n列访问 df['Year']:")
print(df['Year'])
print(type(df['Year'])) # 返回一个 Series
# 访问多个列(传入列名列表)
print("\n访问多列 df[['Name', 'MaxPrice']]:")
print(df[['Name', 'MaxPrice']])行访问 loc['BTH']:
Name 比特币
Year 2017
MaxPrice 19798.68
Name: BTH, dtype: object
<class 'pandas.core.series.Series'>
行访问 iloc[1]:
Name 以太坊
Year 2017
MaxPrice 1440.0
Name: ETH, dtype: object
列访问 df['Year']:
BTH 2017
ETH 2017
EOS 2018
Name: Year, dtype: int64
<class 'pandas.core.series.Series'>
访问多列 df[['Name', 'MaxPrice']]:
Name MaxPrice
BTH 比特币 19798.68
ETH 以太坊 1440.00
EOS 柚子币 15.683. 向量化操作与新增列
Pandas 的强大之处在于其向量化操作能力,可以对整列数据执行运算而无需编写循环。
# 向量化操作:将 MaxPrice 列所有值除以 100
df['MaxPrice/100'] = df['MaxPrice'] / 100
print("新增列后的 DataFrame:")
print(df)新增列后的 DataFrame:
Name Year MaxPrice MaxPrice/100
BTH 比特币 2017 19798.68 197.9868
ETH 以太坊 2017 1440.00 14.4000
EOS 柚子币 2018 15.68 0.1568这种操作简洁高效,是数据处理的首选方式。
四、数据的读取与保存
实际项目中,数据通常存储在外部文件中。Pandas 提供了简便的函数来读写多种格式的数据,最常用的是 CSV 格式。
1. 读取 CSV 文件
假设我们有一个名为 2015.csv 的世界幸福指数报告数据文件。
# 读取 CSV 文件
report_2015_df = pd.read_csv('./2015.csv') # 文件路径需根据实际情况调整
print('数据预览(前5行):')
print(report_2015_df.head())数据预览(前5行):
Country Region Happiness Rank Happiness Score Standard Error \
0 Switzerland Western Europe 1 7.587 0.03411
1 Iceland Western Europe 2 7.561 0.04884
2 Denmark Western Europe 3 7.527 0.03328
3 Norway Western Europe 4 7.522 0.03880
4 Canada North America 5 7.427 0.03553
Economy (GDP per Capita) Family Health (Life Expectancy) Freedom \
0 1.39651 1.34951 0.94143 0.66557
1 1.30232 1.40223 0.94784 0.62877
2 1.32548 1.36058 0.87464 0.64938
3 1.45900 1.33095 0.88521 0.66973
4 1.32629 1.32261 0.90563 0.63297
Trust (Government Corruption) Generosity Dystopia Residual
0 0.41978 0.29678 2.51738
1 0.14145 0.43630 2.70201
2 0.48357 0.34139 2.49204
3 0.36503 0.34699 2.46531
4 0.32957 0.45811 2.45176 默认情况下,Pandas 会添加一个从 0 开始的整数索引列。如果文件中的某一列(如 Country)适合作为索引,可以在读取时指定。
# 指定索引列读取
report_2015_df_indexed = pd.read_csv('./2015.csv', index_col='Country')
print('指定 Country 为索引后的预览:')
print(report_2015_df_indexed.head())指定 Country 为索引后的预览:
Region Happiness Rank Happiness Score Standard Error \
Country
Switzerland Western Europe 1 7.587 0.03411
Iceland Western Europe 2 7.561 0.04884
Denmark Western Europe 3 7.527 0.03328
Norway Western Europe 4 7.522 0.03880
Canada North America 5 7.427 0.03553
Economy (GDP per Capita) Family Health (Life Expectancy) \
Country
Switzerland 1.39651 1.34951 0.94143
Iceland 1.30232 1.40223 0.94784
Denmark 1.32548 1.36058 0.87464
Norway 1.45900 1.33095 0.88521
Canada 1.32629 1.32261 0.90563
Freedom Trust (Government Corruption) Generosity \
Country
Switzerland 0.66557 0.41978 0.29678
Iceland 0.62877 0.14145 0.43630
Denmark 0.64938 0.48357 0.34139
Norway 0.66973 0.36503 0.34699
Canada 0.63297 0.32957 0.45811
Dystopia Residual
Country
Switzerland 2.51738
Iceland 2.70201
Denmark 2.49204
Norway 2.46531
Canada 2.45176 2. 数据筛选与保存
我们可以基于条件轻松筛选数据。
# 筛选出幸福指数排名前5的国家
top5_df = report_2015_df[report_2015_df['Happiness Rank'] <= 5]
print('幸福指数排名前5的国家:')
print(top5_df[['Country', 'Happiness Rank', 'Happiness Score']])幸福指数排名前5的国家:
Country Happiness Rank Happiness Score
0 Switzerland 1 7.587
1 Iceland 2 7.561
2 Denmark 3 7.527
3 Norway 4 7.522
4 Canada 5 7.427将处理后的数据保存到新的 CSV 文件。
# 保存 DataFrame 到 CSV 文件
top5_df.to_csv('top5_happiness.csv', index=False) # index=False 表示不保存行索引列
print("数据已保存至 'top5_happiness.csv'")数据已保存至 'top5_happiness.csv'打开生成的 top5_happiness.csv 文件,你将看到只包含筛选出的 5 行数据,并且没有额外的索引列。
📝 动手练一练
- Series 转换练习:创建一个包含
[10, 20, 30, 40, 50]的 Pandas Series,索引为[‘a’, ‘b’, ‘c’, ‘d’, ‘e’]。请将其值转换为 Python 列表,并计算列表中所有元素的平均值。
点击查看参考答案
import pandas as pd
import numpy as np
# 创建 Series
s = pd.Series([10, 20, 30, 40, 50], index=['a', 'b', 'c', 'd', 'e'])
print('原始 Series:')
print(s)
# 转换为列表
values_list = s.values.tolist()
print('\n转换后的列表:', values_list)
# 计算平均值 (使用NumPy或Python内置函数)
avg_numpy = np.mean(values_list)
avg_python = sum(values_list) / len(values_list)
print('平均值 (NumPy):', avg_numpy)
print('平均值 (Python):', avg_python)原始 Series:
a 10
b 20
c 30
d 40
e 50
dtype: int64
转换后的列表: [10, 20, 30, 40, 50]
平均值 (NumPy): 30.0
平均值 (Python): 30.0- DataFrame 筛选练习:假设你有一个关于商品销售的小型 DataFrame,包含
Product(产品名)、Sales(销售额)、Category(类别)三列。请筛选出销售额大于 100 且类别为 “Electronics” 的所有商品。
点击查看参考答案
import pandas as pd
# 创建示例 DataFrame
data = {
'Product': ['Laptop', 'Mouse', 'Keyboard', 'Desk', 'Monitor'],
'Sales': [1200, 45, 89, 220, 350],
'Category': ['Electronics', 'Electronics', 'Electronics', 'Furniture', 'Electronics']
}
df_sales = pd.DataFrame(data)
print('原始销售数据:')
print(df_sales)
# 条件筛选
filtered_df = df_sales[(df_sales['Sales'] > 100) & (df_sales['Category'] == 'Electronics')]
print('\n筛选结果(销售额>100的电子产品):')
print(filtered_df)原始销售数据:
Product Sales Category
0 Laptop 1200 Electronics
1 Mouse 45 Electronics
2 Keyboard 89 Electronics
3 Desk 220 Furniture
4 Monitor 350 Electronics
筛选结果(销售额>100的电子产品):
Product Sales Category
0 Laptop 1200 Electronics
4 Monitor 350 Electronics本章小结
本节我们学习了数据可视化前期至关重要的数据处理工具——Pandas。你不仅了解了其核心数据结构 Series 和 DataFrame,还掌握了数据索引、向量化操作以及文件读写等基本技能。更重要的是,你明确了将 Pandas 处理后的数据(如 Series.values)转换为 ECharts 所需列表格式的关键步骤。这些知识构成了从数据分析走向数据可视化的坚实第一步。
📋 行动清单
- 动手运行:在 Jupyter Notebook 或你的 Python 环境中,逐行运行本节的所有示例代码,确保理解每一步的输出。
- 数据转换练习:找一份你自己的 CSV 格式数据(或使用课程提供的
2015.csv),用 Pandas 读取,尝试进行筛选、计算新列等操作,最后将结果保存为新文件。 - 预习思考:想一想,如果你已经用 Pandas 准备好了一组国家及其对应数值的数据(格式为列表),下一步该如何用 pyecharts 将其绘制成一张世界地图?
—— 小象教研组
配套资料 · 直接下载
课件、代码、数据集等配套资料全部免费,点击即可直接下载,无需分享或解锁。
- 下载2015.csv · ECharts 课程配套资源课程配套文件