Python Pandas 教程:从零开始掌握
数据是现代世界的石油,而处理和分析数据是释放其价值的关键。在 Python 生态系统中,NumPy 为数值计算提供了强大的基础,而 Pandas 则在其之上构建了一个高效的数据处理和分析库。无论你是数据科学、机器学习的初学者,还是需要处理大量表格数据的工程师或研究人员,掌握 Pandas 都是迈向成功的重要一步。
本教程将从零开始,带你一步步认识 Pandas 的核心概念,并学习如何使用它进行基本的数据操作。无需你有 Pandas 基础,但建议你对 Python 编程有基本了解。
1. 什么是 Pandas?为什么选择它?
Pandas 是一个开源的 Python 库,专门设计用于处理结构化数据(表格数据、时序数据、矩阵数据等)。它的名字来源于 “Panel Data”(面板数据)和 “Python Data Analysis”(Python 数据分析)。
为什么 Pandas 如此受欢迎?
- 高效性: Pandas 的底层是基于 NumPy 构建的,这使得它在处理大量数据时非常高效。
- 便捷性: Pandas 提供了丰富的高级数据结构和操作函数,使得数据清洗、转换、聚合等任务变得非常简单。
- 功能强大: 它能轻松处理各种复杂的数据操作,包括缺失值处理、数据对齐、分组聚合、时间序列分析等。
- 与生态圈融合: Pandas 与 Python 数据科学生态圈的其他库(如 NumPy, Matplotlib, Seaborn, Scikit-learn)无缝集成,可以方便地进行数据可视化、统计建模和机器学习。
- 易学性: 对于熟悉 Python 的用户来说,Pandas 的语法直观易懂。
可以把 Pandas 看作是 Python 中一个非常强大的电子表格或数据库工具,但它具有编程的灵活性和自动化能力。
2. 环境准备与安装
在开始之前,你需要确保你的 Python 环境已经安装了 Pandas。
- 推荐方法 (使用 Anaconda): 如果你使用 Anaconda 或 Miniconda,Pandas 通常已经预装好了。如果需要更新或确认安装,打开终端或 Anaconda Prompt,输入:
bash
conda install pandas - 使用 pip: 如果你使用的是标准的 Python 发行版,可以通过 pip 安装:
bash
pip install pandas
安装完成后,你可以在 Python 解释器或脚本中导入 Pandas 来验证:
python
import pandas as pd
print(pd.__version__)
如果能成功导入并打印版本号,说明安装成功。通常我们会约定俗成地使用 pd
作为 Pandas 的别名。
3. Pandas 的核心数据结构:Series 和 DataFrame
Pandas 的核心是两个主要的数据结构:Series
(序列) 和 `DataFrame
(数据框)。理解它们是掌握 Pandas 的基础。
3.1 Series (序列)
Series
是一种一维带标签的数组,可以存储任何数据类型(整数、浮点数、字符串、Python 对象等)。它可以被看作是一个带有索引的 NumPy 数组,或者是一个只有一列的电子表格。
主要特点:
- 数据 (Data): 存储实际的值。
- 索引 (Index): 存储每个数据点的标签。默认情况下是一个从 0 开始的整数序列,但你也可以指定自定义的索引(例如,字符串、日期等)。
创建 Series:
你可以通过多种方式创建 Series:
-
从列表或 NumPy 数组创建:
“`python
import pandas as pd
import numpy as np从列表创建,使用默认整数索引
s1 = pd.Series([10, 20, 30, 40, 50])
print(s1)
print(“-” * 20)从 NumPy 数组创建,使用默认整数索引
arr = np.array([1.1, 2.2, 3.3, 4.4])
s2 = pd.Series(arr)
print(s2)
“`
输出会显示数据及其对应的索引。 -
从列表创建,指定索引:
“`python
指定自定义字符串索引
s3 = pd.Series([90, 85, 92], index=[‘数学’, ‘语文’, ‘英语’])
print(s3)
“`
这里,索引是科目的名称。 -
从字典创建: 字典的键会成为索引,值会成为数据。
“`python
从字典创建
data_dict = {‘北京’: 1000, ‘上海’: 1200, ‘广州’: 800, ‘深圳’: 950}
s4 = pd.Series(data_dict)
print(s4)
“`
Series 的基本操作:
-
访问数据和索引: 你可以通过
.values
获取数据数组,通过.index
获取索引对象。python
print(s4.values)
print(s4.index) -
通过索引访问元素:
python
print(s4['北京']) # 通过标签索引
print(s4[0]) # 通过整数位置索引 (如果索引是默认的或不重复的)
print(s4[['北京', '上海']]) # 访问多个元素 -
切片:
python
print(s4[0:2]) # 通过整数位置切片 (不包含终止位置)
print(s4['北京':'广州']) # 通过标签切片 (包含终止位置) -
过滤:
“`python
过滤出值大于 900 的城市
print(s4[s4 > 900])
“` -
算术运算: Series 支持向量化运算,可以直接对整个 Series 进行数学计算。
“`python
print(s4 * 1.1) # 所有值增加 10%
print(s4 + s4) # 对应位置相加不同 Series 之间的运算,会基于索引自动对齐
s5 = pd.Series({‘北京’: 100, ‘上海’: 120, ‘杭州’: 50})
print(s4 + s5) # 没有对齐的索引位置会产生 NaN (Not a Number)
“`
3.2 DataFrame (数据框)
DataFrame
是 Pandas 中最常用的数据结构,它是一个二维带标签的数据结构,可以存储不同类型的数据。可以把它想象成一个电子表格、SQL 表或一个 Series 对象的字典。
主要特点:
- 行索引 (Index): 类似于 Series 的索引,用于标识每一行数据。
- 列索引 (Columns): 用于标识每一列数据,通常是列名。
- 数据 (Data): 一个二维的数据块,每一列可以是不同的数据类型。
一个 DataFrame 可以看作是共享同一个索引的 Series 的集合。
创建 DataFrame:
-
从字典创建: 最常见的方式之一,字典的键是列名,值是对应列的数据(可以是列表、NumPy 数组或 Series)。
“`python
从字典创建 DataFrame
data = {
‘城市’: [‘北京’, ‘上海’, ‘广州’, ‘深圳’, ‘成都’],
‘人口 (万)’: [2154, 2428, 1530, 1303, 1650],
‘面积 (km^2)’: [16411, 6340, 7434, 1997, 14312]
}
df = pd.DataFrame(data)
print(df)
“`
默认情况下,行索引是 0 到 n-1 的整数序列。列的顺序会按照字典的键顺序(Python 3.7+)或按字母顺序排列(旧版本)。 -
指定列顺序和行索引:
“`python
指定列的顺序和自定义行索引
df2 = pd.DataFrame(data, columns=[‘城市’, ‘面积 (km^2)’, ‘人口 (万)’],
index=[‘A’, ‘B’, ‘C’, ‘D’, ‘E’])
print(df2)
“` -
从嵌套列表或 NumPy 二维数组创建: 需要同时指定列名和索引。
python
data_list = [
[1, 'Alice', 25],
[2, 'Bob', 30],
[3, 'Charlie', 22]
]
df3 = pd.DataFrame(data_list, columns=['ID', 'Name', 'Age'])
print(df3) -
从 Series 字典创建:
“`python
s_pop = pd.Series([2154, 2428, 1530], index=[‘北京’, ‘上海’, ‘广州’])
s_area = pd.Series([16411, 6340, 7434], index=[‘北京’, ‘上海’, ‘广州’])df4 = pd.DataFrame({‘人口 (万)’: s_pop, ‘面积 (km^2)’: s_area})
print(df4)
``
NaN`。
注意,如果 Series 的索引不同,DataFrame 会自动对齐索引,没有对齐的位置会填充
4. DataFrame 的基本操作
一旦创建了 DataFrame,就可以对其进行各种操作。
4.1 查看数据
-
head(n)
/tail(n)
: 查看前 n 行或后 n 行数据(默认 n=5)。python
print(df.head())
print(df.tail(2)) -
info()
: 查看 DataFrame 的摘要信息,包括每列的数据类型、非空值数量和内存使用情况。python
df.info() -
describe()
: 生成描述性统计信息,包括计数、均值、标准差、最小值、最大值以及分位数。python
print(df.describe()) # 只对数值列有效
print(df.describe(include='all')) # 包含非数值列 -
.index
/.columns
/.values
: 获取行索引、列索引或所有数据的值(作为 NumPy 数组)。python
print(df.index)
print(df.columns)
print(df.values)
4.2 选择列
选择 DataFrame 的列非常简单,就像操作字典一样:
“`python
选择单列(返回 Series)
cities = df[‘城市’]
print(cities)
print(type(cities))
选择多列(返回 DataFrame)
subset = df[[‘城市’, ‘人口 (万)’]]
print(subset)
print(type(subset))
使用点语法访问单列(不推荐用于列名包含空格或特殊字符的情况)
print(df.城市)
“`
4.3 选择行:.loc
和 .iloc
这是 Pandas 中非常重要但也容易混淆的部分。Pandas 提供了两种主要的行选择方式:
.loc
: 基于标签 (Label) 进行索引。你可以使用行索引的标签来选择行。.iloc
: 基于整数位置 (Integer-location) 进行索引。类似于 Python 列表或 NumPy 数组的切片,使用从 0 开始的整数位置来选择行。
使用 .loc
:
“`python
df_indexed = pd.DataFrame(data, columns=[‘城市’, ‘人口 (万)’, ‘面积 (km^2)’],
index=[‘A’, ‘B’, ‘C’, ‘D’, ‘E’])
选择单行(通过行标签)
row_A = df_indexed.loc[‘A’]
print(row_A)
选择多行(通过行标签列表)
rows_AC = df_indexed.loc[[‘A’, ‘C’]]
print(rows_AC)
基于标签的切片(包含起始和终止标签)
rows_A_C_slice = df_indexed.loc[‘A’:’C’]
print(rows_A_C_slice)
选择特定行和列(通过标签)
value_BC_pop = df_indexed.loc[[‘B’, ‘C’], ‘人口 (万)’]
print(value_BC_pop)
选择所有行,特定列
all_rows_cities_pop = df_indexed.loc[:, [‘城市’, ‘人口 (万)’]]
print(all_rows_cities_pop)
选择单行单列的值
value_A_city = df_indexed.loc[‘A’, ‘城市’]
print(value_A_city)
“`
使用 .iloc
:
“`python
使用整数位置选择单行
row_0 = df.iloc[0] # 对应第一行
print(row_0)
使用整数位置选择多行
rows_0_2 = df.iloc[[0, 2]] # 对应第一行和第三行
print(rows_0_2)
基于整数位置的切片(不包含终止位置)
rows_0_to_2_slice = df.iloc[0:2] # 对应第一行和第二行
print(rows_0_to_2_slice)
选择特定行和列(通过整数位置)
value_02_pop = df.iloc[[0, 2], 1] # 第一行和第三行,第二列 (人口)
print(value_02_pop)
选择所有行,特定列(通过整数位置列表)
all_rows_cities_pop_iloc = df.iloc[:, [0, 1]]
print(all_rows_cities_pop_iloc)
选择单行单列的值
value_0_city = df.iloc[0, 0] # 第一行第一列 (城市)
print(value_0_city)
“`
总结 .loc
vs .iloc
:
.loc
使用行标签和列标签。.iloc
使用行位置和列位置(整数,从 0 开始)。- 使用切片时,
.loc
的终止标签包含在结果中,而.iloc
的终止位置不包含在结果中,这与 Python 的切片规则一致。
4.4 添加和删除列
-
添加列: 直接给一个不存在的列名赋值。
“`python
添加一个新列 ‘GDP (万亿)’
df[‘GDP (万亿)’] = [3.0, 3.8, 2.5, 2.7, 1.8]
print(df)添加一个常量列
df[‘国家’] = ‘中国’
print(df)添加一个基于现有列计算的列
df[‘人口密度 (人/km^2)’] = df[‘人口 (万)’] * 10000 / df[‘面积 (km^2)’]
print(df)
“` -
删除列: 使用
drop()
方法或del
关键字。drop()
更常用,因为它返回一个新 DataFrame,而不会修改原始 DataFrame(除非指定inplace=True
)。“`python
使用 drop 删除单列 (axis=1 表示列)
df_no_gdp = df.drop(‘GDP (万亿)’, axis=1)
print(df_no_gdp)使用 drop 删除多列
df_subset = df.drop([‘国家’, ‘人口密度 (人/km^2)’], axis=1)
print(df_subset)使用 inplace=True 直接修改原始 DataFrame
df.drop(‘国家’, axis=1, inplace=True)
print(df)
使用 del 关键字删除列 (直接修改原始 DataFrame)
del df[‘国家’]
print(df)
``
drop()
注意默认删除行 (
axis=0),删除列必须指定
axis=1`。
4.5 处理缺失数据 (NaN)
缺失数据是数据分析中常见的问题。Pandas 使用 NaN
(Not a Number) 来表示缺失值。
-
检查缺失值:
isnull()
或isna()
返回一个布尔型 DataFrame,notnull()
返回非缺失值的布尔型 DataFrame。sum()
可以统计每列的缺失值数量。“`python
制造一些缺失值
df_missing = df.copy()
df_missing.loc[[0, 3], ‘人口 (万)’] = np.nan
df_missing.loc[2, ‘面积 (km^2)’] = np.nan
df_missing.loc[1, ‘GDP (万亿)’] = np.nanprint(df_missing)
print(“\n检查缺失值:”)
print(df_missing.isnull())print(“\n每列缺失值数量:”)
print(df_missing.isnull().sum())
“` -
删除缺失值:
dropna()
可以删除包含缺失值的行或列。“`python
删除包含任何缺失值的行 (axis=0, default)
df_dropped_rows = df_missing.dropna()
print(“\n删除包含缺失值的行:”)
print(df_dropped_rows)删除包含任何缺失值的列 (axis=1)
df_dropped_cols = df_missing.dropna(axis=1)
print(“\n删除包含缺失值的列:”)
print(df_dropped_cols)删除所有值都是缺失值的行或列 (how=’all’)
df_dropped_all = df_missing.dropna(how=’all’) # 如果某行/列所有值都缺失才删除
print(“\n删除所有值都是缺失值的行:”)
print(df_dropped_all)删除指定列中包含缺失值的行
df_dropped_subset = df_missing.dropna(subset=[‘人口 (万)’, ‘面积 (km^2)’])
print(“\n删除指定列中包含缺失值的行:”)
print(df_dropped_subset)
“` -
填充缺失值:
fillna()
可以用指定的值或方法填充缺失值。“`python
用固定值填充
df_filled_0 = df_missing.fillna(0)
print(“\n用 0 填充缺失值:”)
print(df_filled_0)用该列的均值填充
mean_pop = df_missing[‘人口 (万)’].mean()
df_filled_mean = df_missing.fillna({‘人口 (万)’: mean_pop, ‘面积 (km^2)’: df_missing[‘面积 (km^2)’].mean()})
print(“\n用列均值填充缺失值:”)
print(df_filled_mean)使用前向填充 (用前一个非缺失值填充)
df_filled_ffill = df_missing.fillna(method=’ffill’)
print(“\n前向填充:”)
print(df_filled_ffill)使用后向填充 (用后一个非缺失值填充)
df_filled_bfill = df_missing.fillna(method=’bfill’)
print(“\n后向填充:”)
print(df_filled_bfill)
``
fillna默认也返回新 DataFrame,使用
inplace=True` 修改原始 DataFrame。
4.6 排序
你可以按照索引或按照列的值对 DataFrame 进行排序。
-
按照索引排序:
sort_index()
“`python
按照行索引排序
df_indexed_sorted_index = df_indexed.sort_index()
print(“\n按照行索引排序:”)
print(df_indexed_sorted_index)按照列索引排序
df_indexed_sorted_cols = df_indexed.sort_index(axis=1)
print(“\n按照列索引排序 (列名):”)
print(df_indexed_sorted_cols)降序排序
df_indexed_sorted_index_desc = df_indexed.sort_index(ascending=False)
print(“\n按照行索引降序排序:”)
print(df_indexed_sorted_index_desc)
“` -
按照值排序:
sort_values()
“`python
按照单列的值排序
df_sorted_pop = df.sort_values(by=’人口 (万)’, ascending=False)
print(“\n按照人口降序排序:”)
print(df_sorted_pop)按照多列的值排序 (先按第一列,后按第二列)
df_sorted_multi = df.sort_values(by=[‘人口 (万)’, ‘面积 (km^2)’], ascending=[False, True])
print(“\n先按人口降序,再按面积升序排序:”)
print(df_sorted_multi)
“`
4.7 过滤数据 (布尔索引)
使用布尔数组来选择数据子集是 Pandas 中非常强大的功能。
“`python
选择人口大于 1500 万的城市
df_large_pop = df[df[‘人口 (万)’] > 1500]
print(“\n人口大于 1500 万的城市:”)
print(df_large_pop)
选择面积小于 10000 km^2 且 人口大于 2000 万的城市
注意使用 & (and) 和 | (or) 连接条件,并且每个条件都要用括号括起来
df_specific = df[(df[‘面积 (km^2)’] < 10000) & (df[‘人口 (万)’] > 2000)]
print(“\n面积小于 10000 且人口大于 2000 万的城市:”)
print(df_specific)
使用 isin() 过滤
cities_to_select = [‘北京’, ‘深圳’]
df_isin = df[df[‘城市’].isin(cities_to_select)]
print(“\n使用 isin 过滤 (北京和深圳):”)
print(df_isin)
结合 .loc 进行过滤和选择列
df_filtered_subset = df.loc[df[‘人口 (万)’] > 1500, [‘城市’, ‘人口 (万)’]]
print(“\n过滤并选择部分列:”)
print(df_filtered_subset)
“`
5. 数据聚合:Group By
groupby()
是 Pandas 中用于数据聚合(例如,计算分组平均值、总和等)的核心方法。它的工作原理类似于 SQL 的 GROUP BY 语句。
groupby
操作通常遵循“分割-应用-合并”(split-apply-combine)的模式:
- 分割 (Split): 根据某个或多个键将数据分割成组。
- 应用 (Apply): 对每个组独立地应用一个函数(如聚合、转换或过滤)。
- 合并 (Combine): 将应用函数后的结果合并成一个新的 DataFrame 或 Series。
示例数据:
python
data_sales = {
'部门': ['电子', '服饰', '电子', '服饰', '电子', '服饰'],
'季度': ['Q1', 'Q1', 'Q2', 'Q2', 'Q3', 'Q3'],
'销售额': [1000, 800, 1200, 900, 1500, 1100]
}
df_sales = pd.DataFrame(data_sales)
print(df_sales)
使用 groupby()
:
-
按单列分组并计算总和:
“`python
按部门分组,计算各部门的总销售额
sales_by_dept = df_sales.groupby(‘部门’)[‘销售额’].sum()
print(“\n按部门分组的总销售额:”)
print(sales_by_dept)
print(type(sales_by_dept)) # 结果是 Series
``
df_sales.groupby(‘部门’)
这里,创建了一个 groupby 对象,然后我们选择了 '销售额' 列,并应用了
sum()` 聚合函数。 -
按单列分组并计算多种聚合: 使用
agg()
或aggregate()
。“`python
按部门分组,计算各部门的销售总额和平均销售额
sales_agg_dept = df_sales.groupby(‘部门’)[‘销售额’].agg([‘sum’, ‘mean’, ‘count’])
print(“\n按部门分组,计算总额、均值和计数:”)
print(sales_agg_dept)
“` -
按多列分组:
“`python
按部门和季度分组,计算各组的总销售额
sales_by_dept_quarter = df_sales.groupby([‘部门’, ‘季度’])[‘销售额’].sum()
print(“\n按部门和季度分组的总销售额:”)
print(sales_by_dept_quarter)
print(type(sales_by_dept_quarter)) # 结果是 Series (带有 MultiIndex)
“` -
对分组后的多列应用不同聚合:
“`python
假设我们还有一个 ‘成本’ 列
df_sales[‘成本’] = [500, 400, 600, 450, 700, 550]
按部门分组,销售额算总和,成本算平均值
sales_cost_agg = df_sales.groupby(‘部门’).agg({‘销售额’: ‘sum’, ‘成本’: ‘mean’})
print(“\n按部门分组,销售额总和,成本均值:”)
print(sales_cost_agg)
“`
groupby
是 Pandas 数据处理中最强大的工具之一,掌握它对于进行复杂的数据分析至关重要。
6. 读取和写入数据
在实际工作中,数据通常存储在文件中(如 CSV, Excel, JSON 等)。Pandas 提供了方便的函数来读取和写入这些文件。
-
读取 CSV 文件:
pd.read_csv()
“`python
假设有一个名为 ‘data.csv’ 的文件
data.csv 内容示例:
city,population,area
Beijing,2154,16411
Shanghai,2428,6340
Guangzhou,1530,7434
# 读取 CSV 文件
try:
df_csv = pd.read_csv(‘data.csv’)
print(“\n从 CSV 文件读取:”)
print(df_csv)
except FileNotFoundError:
print(“\n文件 data.csv 未找到,跳过读取示例.”)
# 读取时指定某一列作为索引
# df_csv_indexed = pd.read_csv(‘data.csv’, index_col=’city’)
# print(“\n从 CSV 文件读取并设置索引:”)
# print(df_csv_indexed)
``
read_csv有很多参数,可以控制分隔符 (
sep)、是否有表头 (
header)、编码 (
encoding`) 等。 -
读取 Excel 文件:
pd.read_excel()
“`python
假设有一个名为 ‘data.xlsx’ 的文件
# 读取 Excel 文件 (需要安装 openpyxl 或 xlrd 库: pip install openpyxl xlrd)
try:
df_excel = pd.read_excel(‘data.xlsx’, sheet_name=’Sheet1′) # 可以指定 sheet_name
print(“\n从 Excel 文件读取:”)
print(df_excel)
except FileNotFoundError:
print(“\n文件 data.xlsx 未找到,跳过读取示例.”)
except Exception as e:
print(f”\n读取 Excel 文件时出错: {e} (请确保已安装 openpyxl 或 xlrd)”)
“`
-
写入 CSV 文件:
df.to_csv()
“`python
将 DataFrame 写入 CSV 文件
index=False 表示不将 DataFrame 的行索引写入文件
df.to_csv(‘output.csv’, index=False)
print(“\nDataFrame 已写入到 output.csv”)
“`
-
写入 Excel 文件:
df.to_excel()
“`python
将 DataFrame 写入 Excel 文件 (需要安装 openpyxl 库)
df.to_excel(‘output.xlsx’, index=False, sheet_name=’结果’)
print(“\nDataFrame 已写入到 output.xlsx”)
“`
Pandas 还支持读写其他格式,如 JSON (read_json
, to_json
)、HTML 表格 (read_html
, to_html
) 等。
7. 更多高级操作 (简要介绍)
-
合并与连接 (Merge/Join): 将两个或多个 DataFrame 根据共同的列或索引组合在一起。类似于数据库的 JOIN 操作。
pd.merge()
是常用的函数。“`python
示例:合并两个 DataFrame
df1 = pd.DataFrame({‘key’: [‘A’, ‘B’, ‘C’, ‘D’], ‘value1’: [1, 2, 3, 4]})
df2 = pd.DataFrame({‘key’: [‘C’, ‘D’, ‘E’, ‘F’], ‘value2’: [5, 6, 7, 8]})merged_df = pd.merge(df1, df2, on=’key’, how=’inner’) # inner join
print(“\n合并 DataFrame:”)
print(merged_df)
“` -
时间序列 (Time Series): Pandas 对时间序列数据有强大的支持,包括日期范围生成、频率转换、移动窗口计算等。
-
数据转换 (Transformation): 使用
apply()
,map()
,applymap()
等方法对 DataFrame 或 Series 的元素、行或列应用函数。 -
透视表 (Pivot Table): 类似于 Excel 的数据透视表,用于对数据进行重塑和汇总。
pd.pivot_table()
。
8. 总结与下一步
恭喜你!通过这篇教程,你已经从零开始掌握了 Pandas 的核心概念(Series 和 DataFrame)以及一系列基本但至关重要的数据操作,包括:
- 创建 Series 和 DataFrame
- 查看和探索数据
- 选择和过滤数据(包括
.loc
和.iloc
) - 添加和删除列
- 处理缺失值
- 排序数据
- 使用
groupby
进行数据聚合 - 读取和写入文件
Pandas 的功能远不止于此。这只是一个起点。要真正精通 Pandas,你需要:
- 持续练习: 找一些真实世界的数据集(如 Kaggle 上的数据集),尝试使用 Pandas 进行数据清洗和初步分析。
- 深入学习文档: Pandas 官方文档(https://pandas.pydata.org/docs/)是最好的学习资源,它非常详细。
- 学习更多高级功能: 了解如何处理时间序列数据、使用 MultiIndex、进行数据重塑(pivot, melt, stack, unstack)等。
- 结合其他库使用: 学习如何将 Pandas 与 Matplotlib/Seaborn 进行数据可视化,与 Scikit-learn 进行机器学习预处理等。
数据处理是数据科学流程中最耗时但也最关键的部分。掌握 Pandas 将极大地提高你的工作效率和数据分析能力。
开始你的 Pandas 实践之旅吧!