数据预处理pandas pd.json_normalize占用内存过大优化

文章讨论了在使用pandas处理从ES下载的大量JSON数据时,如何因数据解析导致内存占用剧增的问题。解决方法包括分批读取、指定字段类型和合理管理内存。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题描述

从ES下载数据,数据格式为json,然后由pandas进行解析,json中的嵌套字段会进行展开作为列名(由于维度初期无法预测,所以根据数据有啥列就使用啥列,这是最方便的点),变成表格,方面了后续的处理,但在使用过程却发现原本6.xG的数据量在解析,预处理时候会变成60多G,甚至80G的内存占用,资源难以满足

解决

为了方便测试,使用了一个300MB大小的数据进行测试
1.为什么原本的300MB数据量会占用2G内存呢,仅仅下面一个操作

df = pd.json_normalize(datas)

思考:
(1)python是面向全对象语言,所以里面每一个数值都会是对象,这个对象很大
(2)数据集合json中的指标字段并不对齐,例如datas = [{field1:100},{“field1”:90,“field2”:12}],既然pandas是表格,总要填充
验证思考1
查询pd对象,果然用大的对象来存储,数据表中共有2732列,13列是等文本数据对应object,2675为float64,44列为int64,然而pd.json_normalize方法没有设置字段类型

print(df.info())
------------------------------------
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 100000 entries, 0 to 99999
Columns: 2732 entries, feild1 to feild2
dtypes: float64(2675), int64(44), object(13)
memory usage: 2.0+ GB

在这里插入图片描述
验证思考2
其中一个json有新的字段score,发现增加24个字节,说明每条8字节,做了填充

a1 = json.loads('{"name":"zhangsan","age":12}')
a2 = json.loads('{"name":"zhangsan","age":12}')
a3 = json.loads('{"name":"zhangsan","age":12}')
aa = list()
aa.append(a1)
aa.append(a2)
aa.append(a3)
df = pd.json_normalize(aa)
print(df.info())
---------------------------
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 3 entries, 0 to 2
Data columns (total 2 columns):
 #   Column  Non-Null Count  Dtype 
---  ------  --------------  ----- 
 0   name    3 non-null      object
 1   age     3 non-null      int64 
dtypes: int64(1), object(1)
memory usage: 176.0+ bytes
a1 = json.loads('{"name":"zhangsan","age":12}')
a2 = json.loads('{"name":"zhangsan","age":12}')
a3 = json.loads('{"name":"zhangsan","age":12,"scroe":100}')
print(df.info())
---------------------------
memory usage: 200.0+ bytes

解决问题:
(1)如果原始datas数据量太大,那么只能使用pd.json_normalize分批读取后保存csv,(后面合并的时候可能会涉及拼接,这里不展开)
(2)读取csv,指定字段和字段类型,例如读取浮点类型的字段,这里单精度float32就可以啦

pd.read_csv(path, usecols=["浮点列1","浮点列2"], dtype=np.float32)

2.可能中间过程还会涉及拆分训练集,验证集,标准化等,还可以使用del先释放不需要的内存(注意del的对象要确保无引用,否则del无效)

train_x, valid_x, train_y, valid_y = train_test_split(datas, y_index, y, test_size=0.3, random_state=42)
del datas #确保datas无其他引用
### 将JSON文件转换为数据集 对于将JSON文件转换为适合机器学习或数据分析的数据集,通常会利用Python中的`pandas`库来完成这一过程。下面展示了一个具体的例子。 #### 加载并解析JSON文件 首先,需要导入必要的库,并读取JSON文件的内容: ```python import pandas as pd import json with open('data.json', 'r') as file: data = json.load(file) df = pd.DataFrame(data) print(df.head()) ``` 这段代码展示了如何打开名为`data.json`的文件[^3],并通过`json.load()`函数加载其内容到变量`data`中;接着创建一个Pandas DataFrame对象以便于后续操作。 如果JSON结构较为复杂(例如嵌套),可以使用`pd.json_normalize()`方法展开这些复杂的JSON文档,使得它们更适合用于表格形式的数据分析工作流: ```python from pandas import json_normalize nested_data = { "id": 1, "name": {"first": "John", "last": "Doe"}, "hobbies": ["reading", "swimming"] } flat_df = json_normalize(nested_data) print(flat_df) ``` 上述代码片段说明了当遇到具有多层结构的JSON时应采取的方法——通过调用`json_normalize()`函数实现扁平化处理。 #### 数据清理与准备 一旦成功地把JSON转化为DataFrame之后,则进入到至关重要的一步即数据预处理阶段。这可能涉及到移除不必要的列、填补缺失值或是执行其他类型的变换以确保输入给算法的是高质量的信息源。 ```python # 去重 df_cleaned = df.drop_duplicates() # 缺失值填充 df_filled = df.fillna(df.mean()) # 类别型特征编码 df_encoded = pd.get_dummies(df, columns=['category_column']) ``` 以上脚本实现了基本的数据清洗流程,包括但不限于去重、均值填充值以及类别型特征向量化等操作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值