两个使用 Pandas 读取异常数据结构 Excel 的方法,拿走不谢!

简介: 两个使用 Pandas 读取异常数据结构 Excel 的方法,拿走不谢!

通常情况下,我们使用 Pandas 来读取 Excel 数据,可以很方便的把数据转化为 DataFrame 类型。但是现实情况往往很骨干,当我们遇到结构不是特别良好的 Excel 的时候,常规的 Pandas 读取操作就不怎么好用了,今天我们就来看两个读取非常规结构 Excel 数据的例子

本文使用的测试 Excel 内容如下


文末可以获取到该文件

指定列读取

一般情况下,我们使用 read_excel 函数读取 Excel 数据时,都是默认从第 A 列开始读取的,但是对于某些 Excel 数据,往往不是从第 A 列就有数据的,此时我们需要参数 usecols 来进行规避处理

比如上面的 Excel 数据,如果我们直接使用 read_excel(src_file) 读取,会得到如下结果

我们得到了很多未命名的列以及很多我们根本不需要的列数据

此时我们可以通过 usecols 来指定读取哪些列数据

from pathlib import Path
src_file = Path.cwd() /  'shipping_tables.xlsx'
df = pd.read_excel(src_file, header=1, usecols='B:F')


可以看到生成的 DataFrame 中只包含我们需要的数据,特意排除了 notes 列和 date 字段

usecols 可以接受一个 Excel 列的范围,例如 B:F 并仅读取这些列,header 参数需要一个定义标题列的整数,它的索引从0开始,所以我们传入 1,也就是 Excel 中的第 2 行

我们也可以将列定义为数字列表

df = pd.read_excel(src_file, header=1, usecols=[1,2,3,4,5])

也可以通过列名称来选择所需的列数据

df = pd.read_excel(
    src_file,
    header=1,
    usecols=['item_type', 'order id', 'order date', 'state', 'priority'])

这种做法在列的顺序改变但是列的名称不变的时候非常有用

最后,usecols 还可以接受一个可调用的函数

def column_check(x):
    if 'unnamed' in x.lower():
        return False
    if 'priority' in x.lower():
        return False
    if 'order' in x.lower():
        return True
    return True
df = pd.read_excel(src_file, header=1, usecols=column_check)

该函数将按名称解析每一列,并且必须为每一列返回 True 或 False

当然也可以使用 lambda 表达式

cols_to_use = ['item_type', 'order id', 'order date', 'state', 'priority']
df = pd.read_excel(src_file,
                   header=1,
                   usecols=lambda x: x.lower() in cols_to_use)

范围和表格

在某些情况下,Excel 中的数据可能会更加不确定,在我们的 Excel 数据中,我们有一个想要读取的名为 ship_cost 的表,这该怎么获取呢

在这种情况下,我们可以直接使用 openpyxl 来解析 Excel 文件并将数据转换为 pandas DataFrame

以下是使用 openpyxl(安装后)读取 Excel 文件的方法:

from openpyxl import load_workbook
import pandas as pd
from pathlib import Path
src_file = src_file = Path.cwd() / 'shipping_tables.xlsx'
wb = load_workbook(filename = src_file)

查看所有的 sheet 页,获取某个 sheet 页,获取 Excel 范围数据

wb.sheetnames
sheet = wb['shipping_rates']
lookup_table = sheet.tables['ship_cost']
lookup_table.ref


现在我们以及知道要加载的数据范围了, 接下来就是将该范围转换为 Pandas DataFrame

# 获取数据范围
data = sheet[lookup_table.ref]
rows_list = []
# 循环获取数据
for row in data:
    cols = []
    for col in row:
        cols.append(col.value)
    rows_list.append(cols)
df = pd.DataFrame(data=rows_list[1:], index=None, columns=rows_list[0])


这样我们就获取到了干净的表数据了

好了,今天的两个小知识点就分享到这里了,我们下次再见!

相关文章
|
2月前
|
SQL 索引 Python
Pandas中DataFrame合并的几种方法
Pandas中DataFrame合并的几种方法
181 0
|
14天前
|
SQL 数据采集 数据可视化
Pandas 数据结构 - DataFrame
10月更文挑战第26天
33 2
Pandas 数据结构 - DataFrame
|
14天前
|
索引 Python
Pandas 数据结构 - Series
10月更文挑战第26天
30 2
Pandas 数据结构 - Series
|
15天前
|
Python
通过Pandas库处理股票收盘价数据,识别最近一次死叉后未出现金叉的具体位置的方法
在金融分析领域,"死叉"指的是短期移动平均线(如MA5)下穿长期移动平均线(如MA10),而"金叉"则相反。本文介绍了一种利用Python编程语言,通过Pandas库处理股票收盘价数据,识别最近一次死叉后未出现金叉的具体位置的方法。该方法首先计算两种移动平均线,接着确定它们的交叉点,最后检查并输出最近一次死叉及其后是否形成了金叉。此技术广泛应用于股市趋势分析。
31 2
|
23天前
|
数据采集 数据可视化 数据挖掘
Pandas数据结构
‌Pandas提供了两种主要的数据结构
|
1月前
|
Java C++ 索引
让星星⭐月亮告诉你,LinkedList和ArrayList底层数据结构及方法源码说明
`LinkedList` 和 `ArrayList` 是 Java 中两种常见的列表实现。`LinkedList` 基于双向链表,适合频繁的插入和删除操作,但按索引访问元素效率较低。`ArrayList` 基于动态数组,支持快速随机访问,但在中间位置插入或删除元素时性能较差。两者均实现了 `List` 接口,`LinkedList` 还额外实现了 `Deque` 接口,提供了更多队列操作。
23 3
|
1月前
|
存储 数据采集 数据处理
Pandas中批量转换object至float的高效方法
在数据分析中,常需将Pandas DataFrame中的object类型列转换为float类型以进行数值计算。本文介绍如何使用`pd.to_numeric`函数高效转换,并处理非数字值,包括用0或平均值填充NaN值的方法。
42 1
|
1月前
|
存储 算法 Java
数据结构与算法学习八:前缀(波兰)表达式、中缀表达式、后缀(逆波兰)表达式的学习,中缀转后缀的两个方法,逆波兰计算器的实现
前缀(波兰)表达式、中缀表达式和后缀(逆波兰)表达式的基本概念、计算机求值方法,以及如何将中缀表达式转换为后缀表达式,并提供了相应的Java代码实现和测试结果。
46 0
数据结构与算法学习八:前缀(波兰)表达式、中缀表达式、后缀(逆波兰)表达式的学习,中缀转后缀的两个方法,逆波兰计算器的实现
|
1月前
|
存储 编译器 C++
【初阶数据结构】掌握二叉树遍历技巧与信息求解:深入解析四种遍历方法及树的结构与统计分析
【初阶数据结构】掌握二叉树遍历技巧与信息求解:深入解析四种遍历方法及树的结构与统计分析
|
30天前
|
存储
ES6中的Set数据结构的常用方法和使用场景
ES6中的Set数据结构的常用方法和使用场景

热门文章

最新文章