如何将含字节类型的Python列表转换为Pandas DataFrame?
问题描述
从Redis列表获取到字节类型列表:
rec = [b'1674278797,14.33681', b'1674278798,6.03617', b'1674278799,12.78418']
需要转换成如下结构的Pandas DataFrame:
timestamp val 0 1674278797 14.33681 1 1674278798 6.03617 2 1674278799 12.78418
已知转换为[[1674278797,14.33681], [1674278798,6.03617], [1674278799,12.78418]]后,可通过df = pd.DataFrame(rec, columns=['timestamp','val'])生成目标DataFrame,询问可修改Redis元素格式的前提下,最高效的实现方式。
方案一:不修改Redis存储格式,高效转换现有数据
如果暂时不想改动Redis的存储逻辑,用列表推导式结合类型转换是简洁高效的方式,避免冗余操作:
import pandas as pd rec = [b'1674278797,14.33681', b'1674278798,6.03617', b'1674278799,12.78418'] # 解码字节串→分割字符串→转换为对应数值类型 converted = [[int(t), float(v)] for t, v in [item.decode().split(',') for item in rec]] df = pd.DataFrame(converted, columns=['timestamp', 'val'])
若数据量极大,可改用pd.read_csv结合io.StringIO,利用Pandas底层优化提升效率:
import pandas as pd from io import StringIO # 将所有字节串解码后拼接成CSV格式字符串 csv_str = '\n'.join(item.decode() for item in rec) df = pd.read_csv(StringIO(csv_str), names=['timestamp', 'val'], dtype={'timestamp': int, 'val': float})
方案二:修改Redis存储格式,从源头提升效率
如果可以修改Redis中元素的存储格式,推荐直接存储JSON格式的字节串,解析更高效且格式更规范,还能避免字符串分割的潜在错误:
存储到Redis时的修改
import redis import json r = redis.Redis() # 将每个数据点序列化为JSON字节串再存入Redis data_points = [[1674278797,14.33681], [1674278798,6.03617], [1674278799,12.78418]] for point in data_points: r.rpush('data_list', json.dumps(point).encode())
从Redis读取并转换为DataFrame
import pandas as pd import redis import json r = redis.Redis() # 读取所有元素并直接解析JSON rec = r.lrange('data_list', 0, -1) converted = [json.loads(item) for item in rec] df = pd.DataFrame(converted, columns=['timestamp', 'val'])
这种方式的优势在于:JSON自带结构化信息,解析时不会因数据中意外包含逗号出错,且json.loads处理结构化数据的效率比字符串分割+类型转换更稳定,数据量越大优势越明显。
内容的提问来源于stack exchange,提问作者MiRES
相关产品推荐
相关产品推荐

