数据序列化与JSON数据处理全解析
立即解锁
发布时间: 2025-09-01 00:51:30 阅读量: 4 订阅数: 7 AIGC 


Python数据清洗实战指南
### 数据序列化与JSON数据处理全解析
在数据处理过程中,数据的序列化和不同格式数据的导入是重要的环节。下面将详细介绍如何进行表格数据的持久化以及处理JSON数据。
#### 表格数据持久化
在决定何时以及如何序列化数据时,需要考虑多个因素,包括数据分析项目的阶段、保存和重新加载数据的机器的硬件和软件资源,以及数据集的大小。建议仅在项目达到里程碑时对完整数据集进行持久化。
##### 准备工作
- 若系统中没有安装`feather`,可在终端窗口或Windows的PowerShell中输入`pip install pyarrow`进行安装。
- 若章节1文件夹中没有名为`Views`的子文件夹,需要创建该文件夹以运行相关代码。
##### 操作步骤
1. **导入库**:
```python
import pandas as pd
import pyarrow
```
2. **加载CSV文件并处理数据**:
```python
landtemps = pd.read_csv('data/landtempssample.csv',
names=['stationid','year','month','avgtemp','latitude',
'longitude','elevation','station','countryid','country'],
skiprows=1,
parse_dates=[['month','year']],
low_memory=False)
landtemps.rename(columns={'month_year':'measuredate'}, inplace=True)
landtemps.dropna(subset=['avgtemp'], inplace=True)
landtemps.set_index(['measuredate','stationid'], inplace=True)
```
3. **保存极端温度值到CSV和Excel文件**:
```python
extremevals = landtemps[(landtemps.avgtemp < landtemps.avgtemp.quantile(.001)) | (landtemps.avgtemp > landtemps.avgtemp.quantile(.999))]
extremevals.to_excel('views/tempext.xlsx')
extremevals.to_csv('views/tempext.csv')
```
4. **保存为pickle和feather文件**:
```python
landtemps.to_pickle('data/landtemps.pkl')
landtemps.reset_index(inplace=True)
landtemps.to_feather("data/landtemps.ftr")
```
5. **加载pickle和feather文件**:
```python
landtemps = pd.read_pickle('data/landtemps.pkl')
landtemps = pd.read_feather("data/landtemps.ftr")
```
##### 不同格式优缺点对比
| 格式 | 优点 | 缺点 |
| ---- | ---- | ---- |
| CSV | 保存时占用额外内存少 | 写入速度慢,丢失重要元数据(如数据类型) |
| pickle | 保留数据和索引 | 序列化时可能给资源不足的系统带来负担 |
| feather | 对资源要求低,可在Python和R中轻松加载 | 序列化时需牺牲索引,且作者不保证长期支持 |
#### 简单JSON数据导入
JSON是一种非常有用的数据传输标准,具有人类可读、可被大多数客户端设备消费以及结构灵活等特点。但JSON的灵活性也带来了一些问题,下面介绍如何导入简单JSON数据。
##### 准备工作
使用的数据是关于政治候选人新闻报道的数据,可在`dataverse.harvard.edu/dataset.xhtml?persistentId=doi:10.7910/DVN/0ZLHOK`获取,示例文件`allcandidatenewssample.json`可在相关GitHub仓库找到。
##### 操作步骤
1. **导入库**:
```python
import pandas as pd
import numpy as np
import json
import pprint
from collections import Counter
```
2. **加载JSON数据并检查潜在问题**:
```python
with open('data/allcandidatenewssample.json') as f:
candidatenews = json.load(f)
print(len(candidatenews))
pprint.pprint(candidatenews[0:2])
pprint.pprint(candidatenews[0]['source'])
```
3. **检查字典结构差异**:
```python
print(Counter([len(item) for item in candidatenews]))
pprint.pprint(next(item for item in candidatenews if len(item)<9))
pprint.pprint(next(item for item in candidatenews if len(item)>9))
pprint.pprint([item for item in candidatenews if len(item)==2][0:10])
candidatenews = [item for item in candidatenews if len(item)>2]
print(len(candidatenews))
```
4. **生成计数**:
```python
politico = [item for item in candidatenews if item["source"] == "Politico"]
print(len(politico))
pprint.pprint(politico[0:2])
```
5. **获取源数据并确认长度**:
```python
sources = [item.get('source') for item in candidatenews]
print(type(sources))
print(len(sources))
print(sources[0:5])
pprint.pprint(Counter(sources).most_common(10))
```
6. **修正字典中的值**:
```python
for newsdict in candidatenews:
newsdict.update((k, "The Hill") for k, v in newsdict.items() if k == "source" and v == "TheHill")
sources = [item.get('source') for item in candidatenews]
pprint.pprint(Counter(sources).most_common(10))
```
7. **创建pandas DataFrame**:
```python
candidatenewsdf = pd.DataFrame(candidatenews)
```
8. **确认源值并重命名日期列**:
```python
candidatenewsdf.rename(columns={'date':'storydate'}, inplace=True)
candidatenewsdf.storydate = candidatenewsdf.storydate.astype('datetime64[ns]')
print(candidatenewsdf.shape)
print(candidatenewsdf.source.value_counts(sort=True).head(10))
```
通过以上步骤,我们完成了表格数据的持久化和简单JSON数据的导入与处理。在实际应用中,可根据具体需求选择合适的方法和格式。接下来,我们将探讨更复杂的JSON数据导入。
#### 复杂JSON数据导入
JSON数据的灵活性既带来了优势,也带来了挑战。对于复杂的JSON数据,往往不具备传统表格数据的结构,在进行分析时,通常需要将其转换为表格形式。
##### 复杂JSON数据特点
在传统的数据处理中,从多个表中检索数据可能需要进行一对多的合并,将数据保存到一个表或文件中会导致“一”方的数据重复。而JSON可以避免这种数据重复,例如学生的人口统计数据和所学课程数据,JSON可以将课程数据嵌套在每个学生的数据中。
##### 处理方法
对于这种复杂结构的JSON数据,分析时通常有两种选择:
1. 以与习惯不同的方式操作数据。
2. 将JSON转换为表格形式。这里我们采用第二种方法,使用`json_normalize`工具将JSON的选定节点转换为表格结构。
##### 使用API获取JSON数据的优势
通常通过API获取JSON数据,因为这是JSON常见的消费方式。与使用本地保存的文件相比,使用API检索数据的一个优势是,当源数据更新时,更容易重新运行代码。
综上所述,在处理不同格式的数据时,需要根据数据的特点和分析需求选择合适的方法和工具,以确保数据处理的高效性和准确性。无论是表格数据的持久化还是JSON数据的处理,都需要仔细考虑各种因素,才能更好地完成数据分析任务。
### 数据序列化与JSON数据处理全解析
#### 操作示例:使用API获取并处理复杂JSON数据
下面通过一个具体的示例,展示如何使用API获取复杂的JSON数据,并将其转换为表格形式。
##### 操作步骤
1. **导入必要的库**:
```python
import pandas as pd
import requests
from pandas.io.json import json_normalize
```
2. **使用API获取JSON数据**:
假设我们有一个API端点`https://example-api.com/data`,可以通过以下代码获取数据:
```python
response = requests.get('https://example-api.com/data')
data = response.json()
```
3. **使用`json_normalize`将JSON转换为表格形式**:
```python
df = json_normalize(data)
```
4. **数据检查与处理**:
```python
print(df.head())
print(df.shape)
```
通过以上步骤,我们可以将复杂的JSON数据转换为易于分析的表格形式。
#### 常见问题及解决方法
在处理JSON数据时,可能会遇到一些常见问题,以下是一些解决方法:
| 问题 | 解决方法 |
| ---- | ---- |
| JSON数据结构复杂,难以直接转换为表格 | 使用`json_normalize`工具,指定合适的参数进行转换 |
| 数据中存在缺失值 | 根据具体情况进行填充或删除 |
| 数据类型不符合要求 | 使用`astype`方法进行数据类型转换 |
#### 总结与建议
在数据处理过程中,表格数据的持久化和JSON数据的处理是常见的任务。以下是一些总结和建议:
- **表格数据持久化**:根据不同的需求选择合适的格式,如CSV适合数据共享,pickle适合项目收尾时保存数据,feather适合资源有限的环境。
- **JSON数据处理**:对于简单JSON数据,可使用Python的列表和字典操作进行处理;对于复杂JSON数据,使用`json_normalize`工具将其转换为表格形式。
#### 流程图:数据处理流程
```mermaid
graph LR
A[开始] --> B[表格数据持久化]
B --> C[加载CSV文件]
C --> D[处理数据]
D --> E[保存为不同格式]
A --> F[JSON数据处理]
F --> G[简单JSON数据导入]
G --> H[加载JSON数据]
H --> I[检查数据结构]
I --> J[处理数据]
J --> K[创建DataFrame]
F --> L[复杂JSON数据导入]
L --> M[使用API获取数据]
M --> N[转换为表格形式]
N --> O[数据检查与处理]
E --> P[结束]
K --> P
O --> P
```
通过以上的介绍和示例,我们对数据的序列化和JSON数据处理有了更深入的了解。在实际应用中,要根据数据的特点和分析需求,灵活运用各种方法和工具,以提高数据处理的效率和质量。
0
0
复制全文
相关推荐










