如何从数据框中的两列创建列表字典

时间:2015-03-10 00:51:57

标签: python list dictionary

我有一个像这样的数据框

df = pd.DataFrame(columns = ['A', 'B'])
df.A = [1,1,1,2,2,2,2,4,4,5]
df.B = [5,2,4,3,1,5,4,1,2,2]

我目前正在使用

d = {}
for i in df.A:
    d[i] = []
    for v in df.A[df.A == i].index:
        d[i].append(df.B[v])

导致

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

但它很慢。

这样做的pythonic方式是什么?

修改

d = {}
for i in df.A.unique():
    d[i] = df[df.A == i].B.tolist()

似乎仍然必须有更快的方式

感谢您的帮助!

3 个答案:

答案 0 :(得分:4)

您可以使用DataFrame的groupbyto_dict方法,这些方法可以在pandas中完成所有繁重的工作,而不是Python循环,例如:

import pandas as pd
​
df = pd.DataFrame(columns = ['A', 'B'])
df.A = [1,1,1,2,2,2,2,4,4,5]
df.B = [5,2,4,3,1,5,4,1,2,2]
​
d = df.groupby('A')['B'].apply(list).to_dict()

给你:

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

答案 1 :(得分:2)

看广告:list to dictionary conversion with multiple values per key?

from collections import defaultdict
d = defaultdict(list)
for i, j in zip(df.A,df.B):
    d[i].append(j)

如果这样可以吗?

修改 如果需要,可以将其转换为简单的字典:

d = dict(d)

答案 2 :(得分:2)

要在python中使用两个列表创建一个简单的字典,你可以编写(有变化)

mydict = dict(zip(list1, list2)) #assumes len(list1) ==  len(list2)

其中zip()是内置的python,它从同一位置的每个列表中获取一个项目并返回元组列表。通过使用dict()方法强制转换这些元组,您可以创建一个字典,其中list1提供字典键,list2提供值。因此,两个列表都需要具有相同的长度,因为zip方法将遍历提供的列表。您也可以使用izip(),它可以在itertools模块中找到。 izip()将返回迭代器而不是列表。虽然它们都以相同的方式使用,但是根据列表的大小,使用izip()会更节省内存,因为izip()将一次返回一个可迭代对象,而不是将整个列表加载到内存中。话虽这么说,当你使用字典时,它的所有内容都被加载到内存中,因此搜索键和值很快。 (对不起切线)。