Python 从数据帧到元组列表的dict

Python 从数据帧到元组列表的dict,python,pandas,dataframe,pandas-groupby,Python,Pandas,Dataframe,Pandas Groupby,假设我有以下数据帧: df = pd.DataFrame({'id': [1,2,3,3,3], 'v1': ['a', 'a', 'c', 'c', 'd'], 'v2': ['z', 'y', 'w', 'y', 'z']}) df id v1 v2 1 a z 2 a y 3 c w 3 c y 3 d z 我想把它转换成这种格式: {1: [('a', 'z')], 2: [('a', 'y')], 3: [('c', 'w'), ('c',

假设我有以下数据帧:

df = pd.DataFrame({'id': [1,2,3,3,3], 'v1': ['a', 'a', 'c', 'c', 'd'], 'v2': ['z', 'y', 'w', 'y', 'z']})
df
id  v1  v2
1   a   z
2   a   y
3   c   w
3   c   y
3   d   z
我想把它转换成这种格式:

{1: [('a', 'z')], 2: [('a', 'y')], 3: [('c', 'w'), ('c', 'y'), ('d', 'z')]}
我基本上想创建一个dict,其中键是id,值是这个id的(v1,v2)元组列表

我尝试在id中使用groupby:

df.groupby('id')[['v1', 'v2']].apply(list)

但这不起作用

首先创建元组,然后通过聚合
列表传递到
groupby

d = df[['v1', 'v2']].agg(tuple, 1).groupby(df['id']).apply(list).to_dict()
print (d)
{1: [('a', 'z')], 2: [('a', 'y')], 3: [('c', 'w'), ('c', 'y'), ('d', 'z')]}
另一个想法是使用
多索引

d = df.set_index(['v1', 'v2']).groupby('id').apply(lambda x: x.index.tolist()).to_dict()
您可以从
集合
库中使用:

from collections import defaultdict

d = defaultdict(list)

for k, v, s in df.to_numpy():
    d[k].append((v, s))

defaultdict(list,
            {1: [('a', 'z')],
             2: [('a', 'y')],
             3: [('c', 'w'), ('c', 'y'), ('d', 'z')]})
输出:

{'New': {1: ('a', 'z'), 2: ('a', 'y'), 3: ('d', 'z')}}
{'New': {1: ('a', 'z'), 2: ('a', 'y'), 3: ('d', 'z')}}