如何将数据帧转换为集合字典



我有一个dataframe,想要转换由set组成的dictionary

具体来说,我的数据帧和我想做的如下:

month   date
0   JAN       1
1   JAN       1
2   JAN       1
3   FEB       2
4   FEB       2
5   FEB       3
6   MAR       1
7   MAR       2
8   MAR       3

我的目标:

dict = {'JAN' : {1}, 'FEB' : {2,3}, 'MAR' : {1,2,3}}

我还在下面写了一个代码,但是,我不确定它是否合适。实际上数据很大,所以我想知道任何技巧或其他有效(更快(的方法来制作它。

import pandas as pd
df = pd.DataFrame({'month' : ['JAN','JAN','JAN','FEB','FEB','FEB','MAR','MAR','MAR'],
'date'  : [1, 1, 1, 1, 2, 3, 1, 2, 3]})
df_list = df.values.tolist()
monthSet = ['JAN','FEB','MAR']
inst_id_dict = {}
for i in df_list:
monStr = i[0]
if monStr in monthSet:
inst_id = i[1]
inst_id_dict.setdefault(monStr, set([])).add(inst_id)

让我们在"month'列,然后通过GroupBy.unique:进行聚合

df.groupby('month', sort=False)['date'].unique().map(set).to_dict()
#  {'JAN': [1], 'FEB': [2, 3], 'MAR': [1, 2, 3]}

或者,如果您更喜欢集合字典,请使用Groupby.agg:

df.groupby('month', sort=False)['date'].agg(set).to_dict()
# {'JAN': {1}, 'FEB': {2, 3}, 'MAR': {1, 2, 3}}

另一个想法是迭代构建dict(不要担心,尽管使用了循环,但这可能会超出groupby选项(:

out = {}
for m, d in df.drop_duplicates(['month', 'date']).to_numpy():
out.setdefault(m, set()).add(d)
out
# {'JAN': {1}, 'FEB': {2, 3}, 'MAR': {1, 2, 3}}

最新更新