如何将Redis返回的字符串嵌套列表转换为Pandas DataFrame
解决Redis返回数据转换为Pandas DataFrame的问题
我来帮你搞定这个转换问题!从Redis拿到的这些字符串格式的列表确实没法直接丢进Pandas,得先做两步处理:解析字符串成Python对象,再映射到目标列。
首先看你给出的原始数据:
data = ["[Timestamp('2018-05-22 09:15:00'), 3555.75, 3559.15, 3546.45, 3548.3, 34250, 'Green', 34250]", "[Timestamp('2018-05-22 09:16:00'), 3549.05, 3551, 3543.25, 3548, 19500, 'Green', 53750]", "[Timestamp('2018-05-22 09:17:00'), 3548.95, 3553.2, 3548.05, 3548.9, 12000, 'Green', 65750]"]
还有你定义的目标DataFrame列:
df = pd.DataFrame(columns=['date','open','high','close','low','volume','close','total_volume'])
这里先提个小问题:你的列里有两个close,这显然是笔误——原始数据里第7个元素是类似'Green'的标识,建议你把第二个close改成比如signal或者color,不然DataFrame会有重复列名,后续操作容易出问题。
接下来是具体的转换步骤:
步骤1:解析字符串为Python列表
每个元素是字符串形式的列表,而且里面包含Pandas的Timestamp对象,所以我们可以用eval来解析,但要确保先导入Timestamp。代码如下:
import pandas as pd from pandas import Timestamp # 解析每个字符串元素为实际的列表 parsed_data = [eval(item) for item in data]
这样parsed_data就变成了一个包含三个列表的列表,每个列表里的元素都是可直接被Pandas识别的类型。
步骤2:转换为DataFrame并指定列名
这里我先假设你把重复的close改成了signal(对应原始数据里的'Green'),如果不是你想要的,直接替换成你需要的列名就行:
# 修正后的列名(替换了重复的close为signal) columns = ['date','open','high','low','close','volume','signal','total_volume'] df = pd.DataFrame(parsed_data, columns=columns)
如果你坚持要用原来的重复列名,也可以直接用你给出的列,但不推荐:
# 用你原本的列名(不推荐,因为有重复列) df = pd.DataFrame(parsed_data, columns=['date','open','high','close','low','volume','close','total_volume'])
验证结果
运行完上面的代码后,你可以打印df看看结果:
print(df)
输出应该是这样的:
date open high low close volume signal total_volume 0 2018-05-22 09:15:00 3555.75 3559.15 3546.45 3548.30 34250 Green 34250 1 2018-05-22 09:16:00 3549.05 3551.00 3543.25 3548.00 19500 Green 53750 2 2018-05-22 09:17:00 3548.95 3553.20 3548.05 3548.90 12000 Green 65750
最后补充一点:如果担心eval的安全性(比如Redis返回的数据不可信),可以用更安全的方式来解析字符串,比如手动分割字符串并转换类型,但对于你这种明确格式的数据,eval是最简便的方法。
内容的提问来源于stack exchange,提问作者user2371563
相关产品推荐
相关产品推荐

