从pandas数据帧高效创建字典,用于循环



我有以下数据帧:

V1 = ['a','a','c','d']
V2 = ['test1', 'test2'  , 'test3'  , 'test4' ]

df = pd.DataFrame({'V1':V1,'V2':V2})
print(df.head())
V1     V2
a    test1 
a    test2
c    test3 
d    test4

我想循环如下:

for [unique element in v1 column]:
for [corresponding elements in V2]:

我想用以下格式构建一个字典:

dic = { 'a':['test1', 'test2'], 'c':['test3'] , 'd':['test4'] }
for elt in dic:
for i in dic[elt]:

有没有更好/更有效的方法来做这件事?如果没有,我该如何高效地构建这样一本词典?

非常感谢你的帮助!

使用panda构建字典的选项是:

dic = pd.Series(V2, index=V1).groupby(level=0).agg(list).to_dict()

输出:{'a': ['test1', 'test2'], 'c': ['test3'], 'd': ['test4']}

对于经典python,使用collections.defaultdict:

from collections import defaultdict
dic = defaultdict(list)
for k,v in zip(V1, V2):
dic[k].append(v)

dict(dic)
# {'a': ['test1', 'test2'], 'c': ['test3'], 'd': ['test4']}

从初始数据帧循环您的值:

df = pd.DataFrame({'V1':V1,'V2':V2})
for name, d in df.groupby('V1'):
print(f'entering group {name}')
for value in d['V2']:
print(f' value {value}')

输出:

entering group a
value test1
value test2
entering group c
value test3
entering group d
value test4

您可以通过GroupBy.agg聚合list,然后通过DataFrame.to_dict:将Series转换为字典

#your DataFrame
df = pd.DataFrame({'V1':V1,'V2':V2})
d = df.groupby('V1')['V2'].agg(list).to_dict()

只使用python,没有panda!下面的代码只需要O(n)时间,所以速度相当快。

from collections import defaultdict
V1 = ['a','a','c','d']
V2 = ['test1', 'test2'  , 'test3'  , 'test4' ]
my_dict = defaultdict(list)
for x, y in zip(V1, V2):
my_dict[x].append(y)
print(my_dict)

输出

defaultdict(<class 'list'>, {'a': ['test1', 'test2'], 'c': ['test3'], 'd': ['test4']})

如果你认为你有非常大的数据集,那么你可以使用其他pandasgroup by解决方案;像上面这样高效的解决方案对于一般的用例来说已经足够好了。

最新更新