如何在redis中存储pandas数据帧每个元素的值

MsC*_*ous 5 python redis dataframe pandas

我正在编写一个程序,该程序将从 csv 文件读取数据帧,然后计算其中一个属性(列)的哈希值并将其存储为数据帧中的新属性。所有这些都运行良好。但是,我想要的是将哈希属性存储为我的键,将原始属性存储为 redis 中的值。我想对数据框中指定列中的每个元素执行此操作。例如:

这是我的原始数据框:

  customer     value
     a           1
     b           2
     c           3
Run Code Online (Sandbox Code Playgroud)

然后我想计算 value 属性的哈希值:

  customer     value      hash
     a           1        23344
     b           2        34567 
     c           3        78987
Run Code Online (Sandbox Code Playgroud)

最后,我想将哈希属性存储为 Redis 中的键,将值存储为值,例如,如果我要求获取

 r.get(23344) 
Run Code Online (Sandbox Code Playgroud)

预期的答案是:“1”

或者 :

> r.get('78987')
> '3'
Run Code Online (Sandbox Code Playgroud)

下面是我的python代码,我到达了r.set的部分,我的问题是它在属性名称下保存整个属性,所以我无法查询单个元素。

import hashlib
import pandas as pd
import numpy as np
import redis

r = redis.Redis(host='localhost', port=6379, db=0)
df= pd.read_csv ('file.csv') 
df['hash']=df['value'].apply(hash) 

r.set(df['hash'],df['value'])
Run Code Online (Sandbox Code Playgroud)

对于冗长的解释,我深表歉意,我希望得到一些提示,因为我是 pandas 和 redis 的新手

Gua*_*Zuo 8

r.set(df['hash'],df['value'])不是你想要做的,redis 设置只接受键值对作为参数,例如r.set(df[hash][0], df['value'][0])

所以你的代码应该如下所示

for i in range(len(df['value'])):
    r.set(df['hash'][i], df['value'][i])
Run Code Online (Sandbox Code Playgroud)

这会起作用。您还可以使用 redis 管道来加速此操作。

pipe = r.pipeline()
for i in range(len(df['value'])):
    pipe.set(df['hash'][i], df['value'][i])
results = pipe.execute()
Run Code Online (Sandbox Code Playgroud)