【问题标题】:pandas dataframe to dictionary value熊猫数据框到字典值
【发布时间】:2013-10-31 16:31:46
【问题描述】:

我有三列数据报打算以给定的格式在字典中转换:

数据报:

user_id item_id ratings
3         2       3
3         3       4
1         3       1
2         1       4

用户数 = 3

NO of item = 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:[0,0,1], 2:[4,0,0], 3:[0,3,4]}

所以,我能做的就是输出如下:

{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

我的代码中缺少什么,或者我完全走错了路。请帮忙。

【问题讨论】:

    标签: python python-3.x dictionary


    【解决方案1】:

    我会pivot 然后构建字典。例如:

    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
    

    NaNs 替换为 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())),但是当您想稍微调整一下时,它们中的许多方法都不容易概括。

    【讨论】:

    • 但是,哪一个(第一个答案或您的答案)的性能会更快。因为现在,我正在处理大量数据,所以性能很重要!谢谢你的代码 BTW
    • 作为一项规则,应该避免 Python 级别的循环(包括在理解中)。但是关于什么会更快的猜测通常是错误的。从您的数据中提取一小部分并自己计时。
    【解决方案2】:

    将你拥有的东西处理成你想要的东西怎么样:

    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)
    

    processed_data 产生:

    defaultdict(<type 'list'>, {1: [0, 0, 1], 2: [4, 0, 0], 3: [0, 3, 4]})
    

    如果您想将其转换回常规字典(来自defaultdict,),那么 执行以下操作:

    dict(processed_data)
    

    产生

    {1: [0, 0, 1], 2: [4, 0, 0], 3: [0, 3, 4]}
    

    【讨论】:

      猜你喜欢
      • 2016-10-17
      • 2017-08-02
      • 2017-02-27
      • 2020-07-23
      • 2021-07-17
      • 2020-07-22
      • 2021-10-26
      • 2023-03-23
      • 2018-06-24
      相关资源
      最近更新 更多