数据摄取:表格格式与CSV文件处理
立即解锁
发布时间: 2025-09-07 01:56:07 阅读量: 15 订阅数: 50 AIGC 


数据清洗的艺术与实践
# 数据摄取:表格格式与CSV文件处理
在数据处理领域,表格格式的数据无处不在。许多数据以表格形式存在,并且这种形式也非常适合进行数据分析和处理。下面将详细介绍表格格式数据的整理以及CSV文件的相关内容。
## 一、表格数据的整理
### 1.1 整洁数据的概念
整洁数据(tidy data)是一种理想的数据组织方式,它将变量(表格的列,也称为特征或字段)与观测值(表格的行,也称为样本)清晰地分开。在整洁数据中,每个单元格包含一个数据项。然而,实际中遇到的数据往往并非如此,需要进行规范化处理。
例如,有一个小学班级学生成绩的数据,其格式如下:
```python
import pandas as pd
students = pd.read_csv('data/students-scores.csv')
print(students)
```
输出结果:
| Last Name | First Name | 4th Grade | 5th Grade | 6th Grade |
| --- | --- | --- | --- | --- |
| Johnson | Mia | A | B+ | A- |
| Lopez | Liam | B | B | A+ |
| Lee | Isabella | C | C- | B- |
| Fisher | Mason | B | B- | C+ |
| Gupta | Olivia | B | A+ | A |
| Robinson | Sophia | A+ | B- | A |
这种数据布局便于人类阅读,也容易进行可视化。例如,可以将字母成绩转换为数字成绩并绘制学生成绩随年份变化的图表:
```python
# 通用的字母成绩转换为数字成绩的函数
def num_score(x):
to_num = {'A+': 4.3, 'A': 4, 'A-': 3.7,
'B+': 3.3, 'B': 3, 'B-': 2.7,
'C+': 2.3, 'C': 2, 'C-': 1.7}
return x.map(lambda x: to_num.get(x, x))
(students
.set_index('Last Name')
.drop('First Name', axis=1)
.apply(num_score)
.T
.plot(title="Student score by year")
.legend(bbox_to_anchor=(1, .75))
);
```
但是,这种布局存在局限性。当班级升入7年级或获取3年级信息时,需要更改列的数量和位置,而不是简单地添加行。实际上,班级级别(如4年级)本质上是一个值,而不是变量。
### 1.2 数据整理操作
为了使数据更适合分析,可以使用Pandas的`DataFrame.melt()`方法将数据整理为整洁格式:
```python
students.melt(
id_vars=["Last Name", "First Name"],
var_name="Level",
value_name="Score"
).set_index(['First Name', 'Last Name', 'Level'])
```
在R的Tidyverse中,可以使用`pivot_longer()`函数实现类似的操作:
```R
library('tidyverse')
studentsR <- read_csv('data/students-scores.csv')
studentsR %>%
pivot_longer(c('4th Grade', '5th Grade', '6th Grade'),
names_to = "Level",
values_to = "Score")
```
### 1.3 数据整理的逆操作
如果需要将整理后的数据恢复到原来的格式,可以使用R的`pivot_wider()`函数,在Pandas中可以使用`.pivot()`、`.pivot_table()`和`.groupby()`结合`.unstack()`等方法。
## 二、CSV文件
### 2.1 CSV文件概述
逗号分隔值(CSV)文件是一种常见的分隔文本文件,它在每行放置多个值,并用逗号等半保留字符分隔这些值。CSV文件几乎是在其他表格表示之间传输数据的交换格式,许多数据从开始到结束都以CSV格式存在。
### 2.2 CSV文件的优缺点
- **优点**:可以在文本编辑器中轻松打开和理解,也可以使用命令行工具进行处理,是几乎唯一可以在没有专业读取器和库的情况下完全手动修复的格式。
- **缺点**:是第二容易出现结构问题的格式,所有格式在内容问题上的易发性大致相同,但像Excel这样的电子表格在数据完整性方面是最差的格式。
### 2.3 CSV文件的读取和检查
#### 2.3.1 读取问题示例
假设收到一个中等大小的CSV文件,尝试使用Pandas读取:
```python
try:
pd.read_csv('data/big-random.csv')
except Exception as err:
print(err)
```
可能会出现解析错误,例如“ParserError: Error tokenizing data. C error: Expected 6 fields in line 75, saw 8”。
#### 2.3.2 检查文件问题
可以使用命令行工具检查文件的大小和形状:
```bash
wc data/big-random.csv
```
还可以使用管道命令统计每行的逗号数量,以找出可能存在问题的行:
```bash
cat data/big-random.csv |
tr -d -c ',\n' |
awk '{ print length; }' |
sort |
uniq -c
```
#### 2.3.3 处理问题行
根据统计结果,可以决定是丢弃问题行还是手动修复。例如,可以使用正则表达式过滤掉不符合格式的行:
```python
import re
pat = re.compile(r'^([^,]+,){5}[^,]*$')
with open('data/big-random.csv') as fh:
lines = [l.strip().split(',')
for l in fh if re.match(pat, l)]
df = pd.DataFrame(lines)
print(df)
```
### 2.4 数据类型推断问题
CSV文件中的列没有明确的数据类型,许多工具会尝试猜测数据类型,但这可能会出现问题。例如,对于一个固定宽度文件`parts.fwf`:
```bash
cat data/parts.fwf
```
输出:
```
Part_No Description Maker Price (USD)
12345 Wankle rotary engine Acme Corporation 555.55
67890 Sousaphone Marching Inc. 333.33
2468 Feather Duster Sweeps Bros 22.22
A9922 Area 51 metal fragment No Such Agency 9999.99
```
使用Pandas读取前几行时,可能会错误地推断`Part_No`列的数据类型为`int64`:
```python
df = pd.read_fwf('data/parts.fwf', nrows=3)
print(df.dtypes)
```
读取整个文件时,`Part_No`列的数据类型会变为`object`:
```python
df = pd.read_fwf('data/parts.fwf')
print(df.dtypes)
```
R的`tibble`也有类似的行为,但数据类型推断使用1000行,并且如果出现不一致会丢弃值。
### 2.5 转义问题
CSV文件容易出现转义问题,特别是当描述性字段中包含逗号时。不同的工具和版本可能有不同的转义约定,猜测这些约定可能会很混乱。
例如,一种转义方法是在字符串值周围加上引号,另一种方法是在非分隔符的逗号前加上反斜杠。Tab分隔和管道分隔格式虽然可以在一定程度上避免转义问题,但仍然可能出现问题。在这种情况下,需要使用更自定义的解析器,如Python的`csv`模块。
### 2.6 日期时间格式读取问题
数据框库在读取日期时间格式时通常有一个可选开关来解析某些列。Pandas等库支持启发式猜测日期时间格式,但对于数百万行的数据,应用启发式方法可能会非常慢。当日期格式统一时,使用手动格式说明符可以使读取速度提高几个数量级。
例如,对于一个包含多种日期格式的制表符分隔文件`parts.tsv`:
```bash
cat data/parts.tsv
```
输出:
```
Part_No Description Date Price (USD)
12345 Wankle rotary 2020-04-12T15:53:21 555.55
67890 Sousaphone April 12, 2020 333.33
2468 Feather Duster 4/12/2020 22.22
A9922 Area 51 metal 04/12/20 9999.99
```
使用Pandas猜测每行的日期时间格式会非常慢。
综上所述,在处理表格数据和CSV文件时,需要注意数据的整理、格式检查、数据类型推断、转义问题和日期时间格式读取等方面,以确保数据的准确性和可用性。
下面是一个简单的流程图,展示了处理CSV文件的基本流程:
```mermaid
graph TD;
A[读取CSV文件] --> B{检查格式};
B -- 格式正确 --> C[进行数据分析];
B -- 格式错误 --> D[找出问题行];
D --> E{决定处理方式};
E -- 丢弃问题行 --> C;
E -- 手动修复 --> F[重新检查格式];
F --> B;
```
同时,为了更清晰地展示CSV文件处理过程中的不同步骤和决策,我们可以用表格总结:
|步骤|操作|说明|
| --- | --- | --- |
|读取文件|`pd.read_csv('file.csv')`|使用Pandas读取CSV文件,可能会遇到解析错误|
|检查格式|统计逗号数量、正则表达式过滤|找出可能存在问题的行|
|处理问题行|丢弃或手动修复|根据问题行的数量和性质决定处理方式|
|数据类型推断|手动指定或让工具猜测|注意工具猜测可能出现的错误|
|转义问题处理|使用自定义解析器|当文件存在转义问题时,使用更合适的解析器|
|日期时间格式读取|手动指定格式或启发式猜测|根据日期格式的统一程度选择合适的方法|
## 三、固定宽度文件与其他表格格式
### 3.1 固定宽度文件
固定宽度文件与分隔文件类似,它们都是按行组织数据,但固定宽度文件将每个数据字段放置在每行的特定字符位置。过去,Fortran和Cobol流行时,固定宽度格式更为普遍,如今其使用有所减少。
固定宽度文件和分隔文件有相似的优缺点。与分隔文件不同的是,固定宽度文件的危险在于值可能过长。例如,原本认为描述字段不会超过20个字符,但实际超过了,格式就会失效。
下面是一个固定宽度文件`parts.fwf`的示例:
```bash
cat data/parts.fwf
```
输出:
```
Part_No Description Maker Price (USD)
12345 Wankle rotary engine Acme Corporation 555.55
67890 Sousaphone Marching Inc. 333.33
2468 Feather Duster Sweeps Bros 22.22
A9922 Area 51 metal fragment No Such Agency 9999.99
```
许多数据框库可以猜测固定宽度格式并推断列位置和数据类型,但猜测可能会出错。例如,Pandas读取前几行时可能错误推断`Part_No`列的数据类型:
```python
df = pd.read_fwf('data/parts.fwf', nrows=3)
print(df.dtypes)
```
读取整个文件时,数据类型会改变:
```python
df = pd.read_fwf('data/parts.fwf')
print(df.dtypes)
```
### 3.2 其他表格格式
除了CSV和固定宽度文件,还有SQL数据库、电子表格等表格格式。这些格式在数据存储和处理方面各有特点。
- **SQL数据库**:关系型数据库管理系统(RDBMS)自1970年以来取得了巨大成功,世界上很大一部分数据存储在RDBMS中。SQL数据库具有强大的查询和管理功能,适合存储和处理大规模数据。
- **电子表格**:如Excel,是一种常见的表格格式,易于使用和可视化,但在数据完整性方面存在较多问题,是所有格式中数据完整性最差的。
## 四、数据框操作与通用概念
### 4.1 数据框操作
数据框是数据科学家处理表格数据的常用工具。在Python的Pandas和R的Tidyverse中,都提供了丰富的数据框操作方法。
#### 4.1.1 数据整理操作
前面已经介绍了使用Pandas的`DataFrame.melt()`方法和R的`pivot_longer()`函数进行数据整理。这里再总结一下操作步骤:
- **Pandas**:
```python
import pandas as pd
students = pd.read_csv('data/students-scores.csv')
tidy_students = students.melt(
id_vars=["Last Name", "First Name"],
var_name="Level",
value_name="Score"
).set_index(['First Name', 'Last Name', 'Level'])
print(tidy_students)
```
- **R**:
```R
library('tidyverse')
studentsR <- read_csv('data/students-scores.csv')
tidy_studentsR <- studentsR %>%
pivot_longer(c('4th Grade', '5th Grade', '6th Grade'),
names_to = "Level",
values_to = "Score")
print(tidy_studentsR)
```
#### 4.1.2 数据整理的逆操作
在Pandas中,可以使用`.pivot()`、`.pivot_table()`和`.groupby()`结合`.unstack()`等方法将整理后的数据恢复到原来的格式。在R中,可以使用`pivot_wider()`函数。
#### 4.1.3 数据类型转换
在处理数据时,经常需要进行数据类型转换。例如,将字母成绩转换为数字成绩:
```python
def num_score(x):
to_num = {'A+': 4.3, 'A': 4, 'A-': 3.7,
'B+': 3.3, 'B': 3, 'B-': 2.7,
'C+': 2.3, 'C': 2, 'C-': 1.7}
return x.map(lambda x: to_num.get(x, x))
students = pd.read_csv('data/students-scores.csv')
students_scores = students.set_index('Last Name').drop('First Name', axis=1).apply(num_score)
print(students_scores)
```
### 4.2 通用概念
在处理表格数据时,还需要了解一些通用概念。
#### 4.2.1 整洁数据与数据库规范化
整洁数据的概念与数据库规范化密切相关。整洁数据将变量和观测值清晰分开,便于数据分析和处理。数据库规范化是一个大主题,旨在优化数据库结构,减少数据冗余和不一致性。
#### 4.2.2 变量与观测值
变量是表格的列,也称为特征或字段;观测值是表格的行,也称为样本。在数据分析中,需要正确区分变量和观测值,以便进行有效的分析。
#### 4.2.3 标签与值
在表格数据中,标签通常是列名或行名,而值是单元格中的数据。在某些情况下,标签和值的区分可能不明显,需要进行数据整理。
## 五、总结与建议
### 5.1 总结
本文详细介绍了表格格式数据的整理以及CSV文件、固定宽度文件等常见表格格式的处理方法。在处理表格数据时,需要注意以下几点:
- **数据整理**:将数据整理为整洁格式,便于数据分析和处理。
- **格式检查**:在读取文件时,检查文件格式是否正确,找出可能存在的问题行。
- **数据类型推断**:注意工具猜测数据类型可能出现的错误,可以手动指定数据类型。
- **转义问题处理**:当文件存在转义问题时,使用更合适的解析器。
- **日期时间格式读取**:根据日期格式的统一程度选择合适的方法。
### 5.2 建议
- **使用合适的工具**:根据数据的规模和特点,选择合适的工具进行数据处理。例如,对于大规模数据,可以使用Vaex和Dask等Python库;对于小规模数据,Pandas和R的Tidyverse已经足够。
- **手动指定数据类型**:为了避免数据类型推断错误,建议手动指定数据类型。
- **版本控制**:在对数据进行修改时,使用版本控制工具记录数据的变化历史,确保数据的可追溯性。
下面是一个流程图,展示了数据处理的整体流程:
```mermaid
graph TD;
A[获取数据] --> B{选择数据格式};
B -- CSV --> C[处理CSV文件];
B -- 固定宽度文件 --> D[处理固定宽度文件];
B -- 其他格式 --> E[处理其他格式文件];
C --> F[数据整理];
D --> F;
E --> F;
F --> G[数据分析];
G --> H[数据可视化];
```
同时,为了更清晰地展示不同数据格式的特点和处理方法,我们可以用表格总结:
|数据格式|特点|优点|缺点|处理方法|
| --- | --- | --- | --- | --- |
|CSV|用分隔符分隔值|易于打开和处理|易出现结构问题、转义问题|检查格式、处理问题行、手动指定数据类型、使用自定义解析器|
|固定宽度文件|将数据字段放置在特定字符位置|适合特定场景|值可能过长导致格式失效|猜测列位置和数据类型、手动指定|
|SQL数据库|强大的查询和管理功能|适合存储和处理大规模数据|需要专业知识|使用SQL语句进行查询和管理|
|电子表格|易于使用和可视化|方便用户操作|数据完整性差|注意数据的准确性和一致性|
通过本文的介绍,希望读者能够更好地处理表格格式数据,提高数据分析的效率和准确性。
0
0
复制全文
相关推荐









