概述

从今天开始, 小白我将带领大家学习一下 Python 零基础入门的内容. 本专栏会以讲解 + 练习的模式, 带领大家熟悉 Python 的语法, 应用, 以及代码的基础逻辑.
【Python 基础 2023 最新】第七课 Pandas-LMLPHP

Pandas 是什么?

Pandas 是一个开源的 Python 数据分析库, 它提供了大量功能, 能够帮助我们轻松的处理结构化数据. 在数据清洗, 转换, 分析中 Pandas 都是我们的得力助手.

【Python 基础 2023 最新】第七课 Pandas-LMLPHP

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()

输出结果:
【Python 基础 2023 最新】第七课 Pandas-LMLPHP

使用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()

输出结果:
【Python 基础 2023 最新】第七课 Pandas-LMLPHP
使用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()

输出结果:
【Python 基础 2023 最新】第七课 Pandas-LMLPHP

总结

Pandas 在数据分析中的重要性. Pandas 是 Python 数据分析中的一个不可或缺的库. 通过 Pandas, 数据科学家和数据分析师能够轻松的读取, 处理, 分析和可视化数据.

Pandas 的一些关键点:

  1. 灵活性与效率:
10-04 08:46