You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将含字节类型的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 09:01:04