python - 如何将数据框转换为集合字典?
问题描述
我有一个dataframe
并且想要转换一个dictionary
由set
.
具体来说,我的数据框和我想要制作的内容如下:
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)
解决方案
让我们尝试在“月”列上进行分组,然后按以下方式聚合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}}
另一个想法是迭代地构建一个字典(不用担心,尽管使用循环,这可能会超过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}}
推荐阅读
- android - 如何在 ViewFlipper 中共享当前图像
- spring-cloud-dataflow - 配置 Spring Cloud Task 使用 Spring Cloud Data Flow server 的 Kafa
- python - 按字母顺序对列表中的子列表进行排序
- kubernetes - kube-dns。高可用性。kuberntes 中的错误处理
- python - 找不到满足要求的版本 tkinter python 3.7.2 windows 10
- c#-4.0 - C#4.0 使用静态
- javascript - cypress - 我们如何在使用 Cypress 自动化时绕过跨源策略?
- vue.js - vue 好表 - filterDropdownItems 返回不正确的值
- docker-compose - 如何设置 Prometheus 的 node-exporter
- performance - 我应该在反向代理设置中使用 Jetty 或 NGINX 的 gzip 功能吗?