如何基于DataFrame列中特定值迭代切片并生成新DataFrame?
基于DataFrame列值分组提取切片的解决方案
嗨,我来帮你搞定这个需求!其实完全不需要手动逐行迭代来实现,Pandas自带的groupby工具就能高效完成这个任务,而且性能比循环行好太多了。
首先先把你给出的列表转换成正确的Pandas DataFrame:
import pandas as pd districts = [['dist','name','sale','purchase'], ['dis1','avelin',2300, 1400], ['dis2','matri', 4300, 2500], ['dis1', 'texi', 1500, 1700], ['dis2','timi', 2300, 1400]] # 第一行是列名,后面的是数据行 df = pd.DataFrame(districts[1:], columns=districts[0])
推荐方案:用groupby快速生成目标结果
这是最符合Pandas设计理念的方法,一步到位就能得到你想要的字典格式:
# 按dist列分组,提取sale和purchase列并转成列表的列表,最后转成字典 result_dict = df.groupby('dist')[['sale', 'purchase']].apply(lambda x: x.values.tolist()).to_dict()
运行后result_dict的输出就是你期望的样子:
{'dis1': [[2300, 1400], [1500, 1700]], 'dis2': [[4300, 2500], [2300, 1400]]}
如果你想单独取出每个district的结果,直接用键访问就行,比如result_dict['dis1']就能得到对应的数据列表。
为什么不推荐手动迭代行?
很多人刚开始用Pandas会习惯用iterrows()逐行遍历,但这种方式在数据量较大时效率极低——Pandas是为向量化批量操作优化的,groupby内部已经做了高效的批量处理,比循环行快几倍甚至几十倍。
如果你一定要用迭代方式(不推荐)
如果因为特殊场景必须手动遍历行,也可以这样实现:
result_dict = {} # 遍历每一行,_是行索引,我们这里用不到 for _, row in df.iterrows(): dist_key = row['dist'] # 提取当前行的sale和purchase值组成列表 current_data = [row['sale'], row['purchase']] # 如果这个district还没在字典里,先初始化一个空列表 if dist_key not in result_dict: result_dict[dist_key] = [] # 将当前数据添加到对应district的列表中 result_dict[dist_key].append(current_data)
这个方法也能得到同样的结果,但只适合小数据量的场景,大数据量下还是优先用groupby。
内容的提问来源于stack exchange,提问作者mpy
相关产品推荐
相关产品推荐

