首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从dataframe创建字典

从dataframe创建字典
EN

Stack Overflow用户
提问于 2022-03-04 12:42:39
回答 1查看 41关注 0票数 0

我有一个数据数据:

代码语言:javascript
复制
    Cluster PageId  OsId    BrowserId   
0   0      1005581  11       16 
1   0      1016529  11       16 
2   0      1016529  11       17 

以及包含OsId和BrowserId变量的值组合列表的变量梳:

代码语言:javascript
复制
comb=list(set(product(data['OsId'], data['BrowserId'])))

因此,我想创建一个字典,它将梳状列表作为键,PageId作为值。

我试着用这个代码:

代码语言:javascript
复制
comb=list(set(product(data['OsId'], data['BrowserId'])))
dico={}
dico[list('comb')] = list(data['PageId'])

但我发现了一个错误:

代码语言:javascript
复制
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
/tmp/ipykernel_399512/234824120.py in <module>
      2 comb=list(set(product(data['OsId'], data['BrowserId'])))
      3 dico={}
----> 4 dico[list('comb')] = list(data['PageId'])
      5 get_ipython().run_line_magic('pinfo', 'dico')

TypeError: unhashable type: 'list

请你想办法纠正这个错误吗?

谢谢

EN

回答 1

Stack Overflow用户

发布于 2022-03-04 17:10:09

代码中有许多错误。

首先:您使用字符串"comb"而不是列表梳,

第二:dico需要元组(而不是列表)作为键

但最大的问题是,dicodictionary,而词典不像pandas.DataFrame那样工作,它需要for-loop来单独创建每个项目。

代码语言:javascript
复制
dico = {}

comb = set(product(data['OsId'], data['BrowserId']))

for key in comb:
    mask = (data['OsId'] == key[0]) & (data['BrowserId'] == key[1])
    values = data[ mask ]
    dico[key] = values['PageId'].to_list()

但是如果您使用.groupby(...)而不是set(product(...)),可能会更简单。

代码语言:javascript
复制
dico = {}

groups = data.groupby(['OsId', 'BrowserId'])

for key, values in groups:
    dico[key] = values['PageId'].to_list()

使用这两种方法的完整示例。

结果:dico: {(11, 16): [1005581, 1016529], (11, 17): [1016529]}

代码语言:javascript
复制
import pandas as pd
from itertools import product

data = pd.DataFrame([
        [0,1005581,11,16],
        [0,1016529,11,16], 
        [0,1016529,11,17],
    ],
    columns=['Cluster','PageId','OsId','BrowserId']
)

print('\n--- df ---\n')
print(data)

print('\n--- set(product()) ---\n')

dico = {}

comb = set(product(data['OsId'], data['BrowserId']))

for key in comb:
    mask = (data['OsId'] == key[0]) & (data['BrowserId'] == key[1])
    values = data[ mask ]

    print('key:', key)
    print(values)
    print()

    dico[key] = values['PageId'].to_list()

print('dico:', dico)

print('\n--- groups ---\n')

dico = {}

groups = data.groupby(['OsId', 'BrowserId'])

for key, values in groups:
    print('key:', key)
    print(values)
    print()
    dico[key] = values['PageId'].to_list()
    
print('dico:', dico)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71351594

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档