Python 将数据帧转换为字典值
我有三列数据报,打算以给定格式在字典中转换: 数据报:Python 将数据帧转换为字典值,python,python-3.x,dictionary,Python,Python 3.x,Dictionary,我有三列数据报,打算以给定格式在字典中转换: 数据报: user_id item_id ratings 3 2 3 3 3 4 1 3 1 2 1 4 用户数量=3 项目编号=3 评级=0到5 字典= {user_id1:[rating_for_item1, rating_for_item2, rating_for_item3], user_id2:[.same as previo
user_id item_id ratings
3 2 3
3 3 4
1 3 1
2 1 4
用户数量=3
项目编号=3
评级=0到5
字典=
{user_id1:[rating_for_item1, rating_for_item2, rating_for_item3],
user_id2:[.same as previous.],
user_id3:[..same as prev..]}
例如
到目前为止,我可以做的是输出如下:
{1:{3:1}, 2:{1:4}, 3:{2:3, 3:4}} #{user_id:{item_id:rating}.....}
上述输出的代码如下所示:
import pandas as pd
data = {}
cols = ['user_id', 'item_id', 'ratings']
pf = pd.read_csv('filename', sep='\t', names= cols)
for user, item, rate in pf.values: data.setdefault(user,{})[item] = rate
print data
我的代码中缺少了什么,或者我完全走错了路。请帮助。如何将您拥有的东西处理成您想要的东西
from collections import defaultdict
processed_data = defaultdict(list)
for k,v in data.items():
for idx in range(1, 4): # Make sure we check each item
# from (1 to 3 inclusive) for each iteration
# of the dictionary
val = v.get(idx, 0)
processed_data[k].append(val)
处理的_数据
产生:
defaultdict(<type 'list'>, {1: [0, 0, 1], 2: [4, 0, 0], 3: [0, 3, 4]})
产生
{1: [0, 0, 1], 2: [4, 0, 0], 3: [0, 3, 4]}
我将
pivot
,然后构建dict。例如:
pdf = df.pivot("user_id", "item_id").fillna(0)
d = {k: v.tolist() for k,v in pdf.iterrows()}
产生
>>> d
{1: [0.0, 0.0, 1.0], 2: [4.0, 0.0, 0.0], 3: [0.0, 3.0, 4.0]}
首先,框架:
>>> df
user_id item_id ratings
0 3 2 3
1 3 3 4
2 1 3 1
3 2 1 4
支点:
>>> pdf = df.pivot("user_id", "item_id")
>>> pdf
ratings
item_id 1 2 3
user_id
1 NaN NaN 1
2 4 NaN NaN
3 NaN 3 4
将NaN
s替换为0:
>>> pdf = df.pivot("user_id", "item_id").fillna(0)
>>> pdf
ratings
item_id 1 2 3
user_id
1 0 0 1
2 4 0 0
3 0 3 4
并使用字典理解功能构建行字典:
>>> d = {k: v.tolist() for k,v in pdf.iterrows()}
>>> d
{1: [0.0, 0.0, 1.0], 2: [4.0, 0.0, 0.0], 3: [0.0, 3.0, 4.0]}
有很多方法可以完成最后一步,包括
dict(zip(pdf.index,pdf.values.tolist())
,但当您想稍微调整一下时,其中许多方法都不容易概括。但是,哪一种(第一个答案或您的答案)性能更快。因为现在,我正在处理大量的数据,所以性能很重要!感谢您提供了较少的代码BTWAs规则,应该避免Python级别的循环(这包括在理解中)。但对什么会更快的猜测往往是错误的;从你的数据中选取一小部分,自己计时。
>>> pdf = df.pivot("user_id", "item_id").fillna(0)
>>> pdf
ratings
item_id 1 2 3
user_id
1 0 0 1
2 4 0 0
3 0 3 4
>>> d = {k: v.tolist() for k,v in pdf.iterrows()}
>>> d
{1: [0.0, 0.0, 1.0], 2: [4.0, 0.0, 0.0], 3: [0.0, 3.0, 4.0]}