我有一个像这样的数据框
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()
似乎仍然必须有更快的方式
感谢您的帮助!
答案 0 :(得分:4)
您可以使用DataFrame的groupby
和to_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()将一次返回一个可迭代对象,而不是将整个列表加载到内存中。话虽这么说,当你使用字典时,它的所有内容都被加载到内存中,因此搜索键和值很快。 (对不起切线)。