【Python 基础 2022 最新】第七课 Pandas
概述
从今天开始, 小白我将带领大家学习一下 Python 零基础入门的内容. 本专栏会以讲解 + 练习的模式, 带领大家熟悉 Python 的语法, 应用, 以及代码的基础逻辑.
Pandas 是什么?
Pandas 是一个开源的 Python 数据分析库, 它提供了大量功能, 能够帮助我们轻松的处理结构化数据. 在数据清洗, 转换, 分析中 Pandas 都是我们的得力助手.
Pandas 的应用场景
Pandas 的主要应用场景:
- 数据清洗: 如处理丢失的数据, 过滤数据等
- 数据转换: 如创建新的数据结构, 聚合数据等
- 数据分析: 如计算统计量, 对数据进行分组和汇总等
- 数据可视化: 与其他库 (Matplotlib, Seaborn) 结合, 绘制可视化图表
安装 Pandas
在 cmd 中输入:
pip install pandas
查看是否安装成功:
import pandas as pd
Pandas 数据结构
Pandas 有两个核心的数据结构. “Series” 和 “DataFrame”.
Series 数组
什么是 Series?
Series 是一个一维的标签化数组, Series 它可以容纳任何数据类型 (整型, 字符串, 浮点数, Python 对象等). Series 与普通的 Python 列表相似, 但是具有更多的功能和灵活性.
Series 创建
格式:
pd.Series(data, index=None, dtype=None, name=None, copy=None, fastpath=False)
参数:
- data: 列表状数据
- index: 索引, 默认为 None
- drype: 返回的 Series 数组的类型, 默认为 None
- name: Series 数组的名字, 默认为 None
- copy: 复制输入的数据, 默认为 None
例子:
import pandas as pd
# 创建 Series 数组
list1 = [1, 2, 3] # 创建列表
series1 = pd.Series(list1) # 通过 list 创建 Series 数组
print(series1) # 调试输出
import pandas as pd
# 创建 Series 数组, 带 Index
student_name = ["张三", "李四", "我是小白呀"] # 创建学生名字列表, 用于索引学生id
student_id = [1, 2, 3] # 创建学生 id 列表
series2 = pd.Series(student_id, index=student_name) # 创建 Series 数组
print(series2) # 调试输出
# 通过字典创建 Series 数组
dict1 = {'a':1,'b':2, 'c':3} # 创建字典
series3 = pd.Series(dict1) # 通过字典创建 Series 数组
print(series3) # 调试输出
输出结果:
0 1
1 2
2 3
dtype: int64
张三 1
李四 2
我是小白呀 3
dtype: int64
a 1
b 2
c 3
dtype: int64
Series 数组操作
数据检索
Series 数组中, 我们可以通过索引来实现数据检索.
例子:
import pandas as pd
# 创建 Series 数组, 带 Index
student_name = ["张三", "李四", "我是小白呀"] # 创建学生名字列表, 用于索引学生id
student_id = [1, 2, 3] # 创建学生 id 列表
series1 = pd.Series(student_id, index=student_name) # 创建 Series 数组
print(series1) # 调试输出
# 数据检索
zhangsan_id = series1["张三"] # 通过索引提取张三对应的 id
lisi_id = series1["李四"] # 通过索引提取李四对应的 id
iamarookie_id = series1["我是小白呀"] # 通过索引提取小白对应的 id
print("张三的 id:", zhangsan_id)
print("李四的 id:", lisi_id)
print("张三的 id:", iamarookie_id)
# 多重检索
ids = series1[["张三", "李四"]] # 通过索引提取张三和李四的 id
print("张三 & 李四的 id: \n{}".format(ids)) # 调试输出
输出结果:
张三 1
李四 2
我是小白呀 3
dtype: int64
张三的 id: 1
李四的 id: 2
张三的 id: 3
张三 & 李四的 id:
张三 1
李四 2
dtype: int64
数据修改
Series 数组中, 可以用过索引来修改 Series 中的数据.
例子:
import pandas as pd
# 创建 Series 数组, 带 Index
student_name = ["张三", "李四", "我是小白呀"] # 创建学生名字列表, 用于索引学生id
student_id = [1, 2, 3] # 创建学生 id 列表
series1 = pd.Series(student_id, index=student_name) # 创建 Series 数组
print(series1) # 调试输出
# 数据修改
series1["张三"] = 123 # 将 Series 数组中, 索引张三对应的 id 修改为 123
print(series1) # 调试输出
输出结果:
张三 1
李四 2
我是小白呀 3
dtype: int64
张三 123
李四 2
我是小白呀 3
dtype: int64
过滤
Series 数组可以用过布尔索引来实现数据过滤.
例子:
import pandas as pd
# 创建关于学生成绩的 Series 数组
student_name = ["张三", "李四", "我是小白呀"] # 创建学生名字列表, 用于索引学生成绩
student_grade = [88, 90, 55] # 创建学生成绩列表
series1 = pd.Series(student_grade, index=student_name) # 创建 Series 数组
print(series1) # 调试输出
# 数据修改
result = series1[series1 < 60]
print("成绩不及格的同学: \n{}".format(result)) # 调试输出
输出结果:
张三 88
李四 90
我是小白呀 55
dtype: int64
成绩不及格的同学:
我是小白呀 55
dtype: int64
Series 数组运算
import pandas as pd
# 创建关于学生成绩的 Series 数组
student_name = ["张三", "李四", "我是小白呀"] # 创建学生名字列表, 用于索引学生成绩
student_grade = [88, 90, 55] # 创建学生成绩列表
series1 = pd.Series(student_grade, index=student_name) # 创建 Series 数组
print("加分前: \n{}".format(series1)) # 调试输出
# Series 数组运算
series1 = series1 + 5 # 鉴于小白同学不及格, 老师觉得给大家都加 5 分
print("加分后: \n{}".format(series1)) # 调试输出
输出结果:
加分前:
张三 88
李四 90
我是小白呀 55
dtype: int64
加分后:
张三 93
李四 95
我是小白呀 60
dtype: int64
总结
Pandas 中的 Series 提供了一种灵活且强大的方式来处理数据. 无论是数据分析, 数据清洗还是数据操作, Series 都是一个非常有用的工具.
什么是 DataFrame
DataFrame 是一个二维的标签化数据结构, 类似于一个 Excel 表格. DataFrame 中的值都是相同长度的 Series, DataFrame 是 Pandas 最常用和强大的数据结构.
DataFrame 创建
通过使用pd.DataFrame
函数我们可以创建 DataFrame 数组, DataFrame 可以由多种数据穿点, 如字典, 列表, 或外部文件.
格式:
pd.DataFrame(data=None, index=None, columns=None, dtype=None, copy=None)
参数:
- data: 列表状数据
- index: 索引, 默认为 None
- columns: 列名, 默认为 None
- detype: 返回的 Series 数组的类型, 默认为 None
- copy: 复制输入的数据, 默认为 None
例子:
import pandas as pd
# 创建 DataFrame 数组
data = {"名字":["张三", "李四", "我是小白呀"], "年龄":[25, 32, 18]} # 创建字典
df = pd.DataFrame(data) # 由字典创建 DataFrame 数组
print(df) # 调试输出
输出结果:
名字 年龄
0 张三 25
1 李四 32
2 我是小白呀 18
DataFrame 操作
数据检索
通过列名, 我们可以检索 DataFrame 中的数据.
例子:
import pandas as pd
# 创建 DataFrame 数组
data = {"名字":["张三", "李四", "我是小白呀"], "年龄":[25, 32, 18]} # 创建字典
df = pd.DataFrame(data) # 由字典创建 DataFrame 数组
print(df) # 调试输出
# 检索名字列
name = df["名字"] # 提取名字列
print("提取名字列: \n{}".format(name)) # 调试输出
输出结果:
名字 年龄
0 张三 25
1 李四 32
2 我是小白呀 18
提取名字列:
0 张三
1 李四
2 我是小白呀
Name: 名字, dtype: object
筛选数据
例子:
import pandas as pd
# 创建 DataFrame 数组
data = {"名字":["张三", "李四", "我是小白呀"], "年龄":[25, 32, 18]} # 创建字典
df = pd.DataFrame(data) # 由字典创建 DataFrame 数组
print(df) # 调试输出
# 检索名字列
name = df["名字"] # 提取名字列
print("提取名字列: \n{}".format(name)) # 调试输出
输出结果:
import pandas as pd
# 创建 DataFrame 数组
data = {"名字":["张三", "李四", "我是小白呀"], "年龄":[25, 32, 18]} # 创建字典
df = pd.DataFrame(data) # 由字典创建 DataFrame 数组
print(df) # 调试输出
# 检索名字列
name = df["名字"] # 提取名字列
print("提取名字列: \n{}".format(name)) # 调试输出
排序
格式:
pd.DataFrame.sort_values(by, *, axis=0, ascending=True, inplace=False, kind='quicksort', na_position='last', ignore_index=False, key=None)
参数:
- axis: 轴, 默认为纵向排序
- ascending: 从低到高
- inplace: 替换原本 DataFrame, 默认为 False
例子:
import pandas as pd
# 创建 DataFrame 数组
data = {"名字":["张三", "李四", "我是小白呀"], "年龄":[25, 32, 18]} # 创建字典
df = pd.DataFrame(data) # 由字典创建 DataFrame 数组
print(df) # 调试输出
# DataFrame 排序
df = df.sort_values(by="年龄") # 通过布尔条件筛选特定数据
df.reset_index(inplace=True) # 重新索引
print("排序: \n{}".format(df)) # 调试输出
注: 通过df.reset_index(inplace=True)
, DataFrame 数组会进行重新索引.
聚合
我们可以对 DataFrame 数字进行各种聚合操作.
例子:
import pandas as pd
# 创建 DataFrame 数组
data = {"名字":["张三", "李四", "我是小白呀"], "年龄":[25, 32, 18]} # 创建字典
df = pd.DataFrame(data) # 由字典创建 DataFrame 数组
print(df) # 调试输出
# DataFrame 聚合
mean = df["年龄"].mean() # 通过布尔条件筛选特定数据
print("平均年龄:", mean) # 调试输出
输出结果:
名字 年龄
0 张三 25
1 李四 32
2 我是小白呀 18
平均年龄: 25.0
增删
import pandas as pd
# 创建 DataFrame 数组
data = {"名字":["张三", "李四", "我是小白呀"], "年龄":[25, 32, 18]} # 创建字典
df = pd.DataFrame(data) # 由字典创建 DataFrame 数组
print(df) # 调试输出
# 添加列
data["成绩"] = [78, 82, 60] # 添加一个新的列, 成绩
print(df) # 调试输出
# 删除列
del data["年龄"] # 删除年龄列
print(df)
输出结果:
名字 年龄
0 张三 25
1 李四 32
2 我是小白呀 18
名字 年龄
0 张三 25
1 李四 32
2 我是小白呀 18
名字 年龄
0 张三 25
1 李四 32
2 我是小白呀 18
数据加载
我们经常会遇到需要从 csv 文件中加塞数据的情况. Pandas 中提供了read_csv
方法, 使得我们从 csv 文件中加载数据变得非常简单.
CSV 文件加载
格式:
pandas.read_csv(filepath_or_buffer, *, sep=_NoDefault.no_default, delimiter=None, header='infer', names=_NoDefault.no_default, index_col=None, usecols=None, dtype=None, engine=None, converters=None, true_values=None, false_values=None, skipinitialspace=False, skiprows=None, skipfooter=0, nrows=None, na_values=None, keep_default_na=True, na_filter=True, verbose=False, skip_blank_lines=True, parse_dates=None, infer_datetime_format=_NoDefault.no_default, keep_date_col=False, date_parser=_NoDefault.no_default, date_format=None, dayfirst=False, cache_dates=True, iterator=False, chunksize=None, compression='infer', thousands=None, decimal='.', lineterminator=None, quotechar='"', quoting=0, doublequote=True, escapechar=None, comment=None, encoding=None, encoding_errors='strict', dialect=None, on_bad_lines='error', delim_whitespace=False, low_memory=True, memory_map=False, float_precision=None, storage_options=None, dtype_backend=_NoDefault.no_default)
参数:
- filepath_or_buffer: 文件路径
- header: 表头
- names: 列名
例子:
import pandas as pd
# 读取 txt/csv
data = pd.read_csv("test.txt", header=None, names=["链接"])
print(data) # 调试输出
输出结果:
链接
0 http://melanz.phorum.pl/viewtopic.php?f=7&t=64041
1 http://www.reo14.moe.go.th/phpBB3/viewtopic.ph...
2 https://www.xroxy.com/xorum/viewtopic.php?p=30...
3 http://armasow.forumbb.ru/viewtopic.php?id=840...
4 http://telecom.liveforums.ru/viewtopic.php?id=...
5 http://www.crpsc.org.br/forum/viewtopic.php?f=...
6 http://community.getvideostream.com/topic/4803...
7 http://www.shop.minecraftcommand.science/forum...
8 https://www.moddingway.com/forums/thread-31914...
9 https://webhitlist.com/forum/topics/main-featu...
Excel 文件加载
例子:
df = pd.read_excel('path_to_file.xlsx')
数据探索
在 DataFrame 中, 我们可以用过一些函数来查看 DataFrame 数据的基本结构和内容.
常用函数:
df.info()
: 返回数据基本信息, 包括数据类型, 非空等df.head()
: 显示前 5 行df.tail()
: 显示最后 5 行df.describe()
: 显示基本统计信息, 包括: 如平均值, 标准差, 最小值, 25th, 50th (中位数) 和 75th 百分位数, 最大值等
例子:
import pandas as pd
# 读取数据
data = pd.read_csv("students.txt", header=None)
print(data.info()) # 显示总览, 包括每列的数据类型和非空值的数量
print(data.head()) # 显示前 5 行
print(data.tail()) # 显示后 5 行
print(data.describe()) # 显示基本统计信息
调试输出:
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 131 entries, 0 to 130
Data columns (total 2 columns):
0 131 non-null object
1 131 non-null object
dtypes: object(2)
memory usage: 2.1+ KB
None
0 1
0 c1235666 Fink-Nottle Augustus James
1 c3456765 O'Mahoney Geoffrey
2 c8732719 De Leo Victoria Margaret
3 c9676814 Thompson Sabrina
4 c4418710 Heck Kevin
0 1
126 c6060052 Long Marilyn
127 c2390980 Martz Perry Tony William
128 c5456142 Wilson Christine Mabel
129 c1036678 Bunch Richard Frank
130 c8306065 Hartley Marcel Jonathan Philip
0 1
count 131 131
unique 131 127
top c3827371 Bush Thomas
freq 1 2
数据清洗
大多情况下, 数据可能不总是完整的, 所以我们要处理数据丢失. Pandas 提供了多种处理缺失数据的方法.
常用函数:
df.dropna()
: 删除数据中所有缺失的行- ```df.fillna()````: 使用指定的值填充缺失数据
缺失数据处理:
df.dropna()
df.fillna(value)
去重:
df.drop.duplicates()
数据转换:
df['column_name'] = df['column_name'].astype('new_type') # 转换数据类型
df['new_column'] = df['column1'] + df['column2']
数据合并, 连接与管理
合并
contact()
函数可以帮助我们连接两个或者多个数据.
格式:
df.concat(objs, axis=0, join='outer', join_axes=None, ignore_index=False,
keys=None, levels=None, names=None, verify_integrity=False,
sort=None, copy=True)
参数:
- objs: 需要拼接的数字
- join: 拼接模式
- join_axes: 拼接轴
例子:
import pandas as pd
# 初始化 DataFrame 数组
df1 = pd.DataFrame({'A': ['A0', 'A1', 'A2'],
'B': ['B0', 'B1', 'B2']})
df2 = pd.DataFrame({'A': ['A3', 'A4', 'A5'],
'B': ['B3', 'B4', 'B5']})
# 调试输出
print(df1)
print(df2)
# 进行 concat 连接
result = pd.concat([df1, df2])
print(result)
调试输出:
A B
0 A0 B0
1 A1 B1
2 A2 B2
A B
0 A3 B3
1 A4 B4
2 A5 B5
A B
0 A0 B0
1 A1 B1
2 A2 B2
0 A3 B3
1 A4 B4
2 A5 B5
```merge()``函数也可以帮助我们进行合并操作, 类似于 SQL 的 JOIN.
例子:
import pandas as pd
# 初始化 DataFrame 数组
left = pd.DataFrame({'key': ['K0', 'K1', 'K2'],
'A': ['A0', 'A1', 'A2'],
'B': ['B0', 'B1', 'B2']})
right = pd.DataFrame({'key': ['K0', 'K1', 'K2'],
'C': ['C0', 'C1', 'C2'],
'D': ['D0', 'D1', 'D2']})
# 调试输出
print(left)
print(right)
# 使用 merge 拼接
result = pd.merge(left, right, on='key')
print(result)
输出结果:
key A B
0 K0 A0 B0
1 K1 A1 B1
2 K2 A2 B2
key C D
0 K0 C0 D0
1 K1 C1 D1
2 K2 C2 D2
key A B C D
0 K0 A0 B0 C0 D0
1 K1 A1 B1 C1 D1
2 K2 A2 B2 C2 D2
分组与聚合
使用groupby()
可以将数组框按列值分组, 然后对每个组应用聚合函数.
例子:
# 初始化 DataFrame 数组
df = pd.DataFrame({'A': ['foo', 'bar', 'foo', 'bar'],
'B': [1, 2, 3, 4],
'C': [2.0, 3.0, 4.0, 5.0]})
print(df)
# 聚合求和
grouped = df.groupby('A').sum()
print(grouped)
调试输出:
# 初始化 DataFrame 数组
df = pd.DataFrame({'A': ['foo', 'bar', 'foo', 'bar'],
'B': [1, 2, 3, 4],
'C': [2.0, 3.0, 4.0, 5.0]})
print(df)
# 聚合求和
grouped = df.groupby('A').sum()
print(grouped)
常见的聚合函数:
sum()
: 求和mean()
: 平均数median()
: 求中位数min()
: 求最小值max()
: 求最大值
时间序列分析
Pandas 提供了 “datatime” 和 “timedelta” 类型, 用于处理时间数据.
例子:
import pandas as pd
# 时间序列分析
data = pd.to_datetime(['2023-01-01', '2023-02-01'])
print(data) # 调试输出
输出结果:
DatetimeIndex(['2023-01-01', '2023-02-01'], dtype='datetime64[ns]', freq=None)
数据可视化
我们可以通过 Pandas 进行基本的数据可视化.
Pandas 除了能进行数据处理和分析的功能外, 还提供了简单直观的绘制方法:
- ````plot()```: 绘制线图, 通常用于时间序列数据
hist()
: 绘制直方图, 有助于观察数据分布boxpolt()
: 绘制箱线图, 可用于观察数据的中位数, 分位数等统计指标
使用plot
绘制线图:
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
# 生成示例数据
date_rng = pd.date_range(start='2020-01-01', end='2020-12-31', freq='D')
df = pd.DataFrame(date_rng, columns=['date'])
df['data'] = np.random.randint(0, 100, size=(len(date_rng)))
df.set_index('date', inplace=True)
df.plot(figsize=(10, 6))
plt.title('Time Series Data Visualization')
plt.ylabel('Random Data')
plt.show()
输出结果:
使用hist()
绘制直方图:
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
# 生成示例数据
date_rng = pd.date_range(start='2020-01-01', end='2020-12-31', freq='D')
df = pd.DataFrame(date_rng, columns=['date'])
df['data'] = np.random.randint(0, 100, size=(len(date_rng)))
# 绘制直方图
df['data'].hist(bins=30, figsize=(10, 6))
plt.title('Histogram Data Visualization')
plt.xlabel('Random Data')
plt.ylabel('Frequency')
plt.show()
输出结果:
使用boxplot()
绘制箱线图:
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
# 生成示例数据
date_rng = pd.date_range(start='2020-01-01', end='2020-12-31', freq='D')
df = pd.DataFrame(date_rng, columns=['date'])
df['data'] = np.random.randint(0, 100, size=(len(date_rng)))
# 绘制箱线图
df.boxplot(column='data', figsize=(6, 10))
plt.title('Boxplot Data Visualization')
plt.ylabel('Random Data')
plt.show()
输出结果:
总结
Pandas 在数据分析中的重要性. Pandas 是 Python 数据分析中的一个不可或缺的库. 通过 Pandas, 数据科学家和数据分析师能够轻松的读取, 处理, 分析和可视化数据.
Pandas 的一些关键点:
- 灵活性与效率: