如何按指定列的多个唯一值拆分DataFrame或数组
Pandas按account_id列拆分DataFrame实现方案
- 优先使用pandas内置
groupby方法实现,这是性能最优、代码最简洁的方案,完全适配数千行规模的数据集,无需手写逐行循环:
import pandas as pd # 原始DataFrame变量名为df account_subdfs = {} # groupby的sort=False参数可以关闭分组排序,保持原数据中id的出现顺序,进一步提升速度 for acc_id, sub_df in df.groupby('account_id', sort=False): # 存储为子DataFrame,重置索引避免后续处理出现索引混乱 account_subdfs[acc_id] = sub_df.reset_index(drop=True) # 如果需要数组格式,直接替换成下面这行即可 # account_subdfs[acc_id] = sub_df.to_numpy()
调用的时候直接用account_subdfs['ab123982173']就能拿到对应账号的子数据,后续做格式转换、批量处理都很方便。
- 如果后续只需要数组格式做计算,且同一个
account_id的行在原表中是连续排列的,可以用numpy的拆分方法进一步提升速度:
import numpy as np # 提取account_id列的编码,定位不同id的切分位置 id_encoding, unique_acc_ids = df['account_id'].factorize() split_pos = np.where(np.diff(id_encoding) != 0)[0] + 1 # 直接切分整体数组 split_arr_list = np.split(df.to_numpy(), split_pos) # 打包成账号id对应子数组的字典 account_subarrays = dict(zip(unique_acc_ids, split_arr_list))
注意:如果原表中同一个
account_id的行是分散不连续的,使用numpy拆分前需要先执行df = df.sort_values('account_id').reset_index(drop=True)排序,否则会把同一id的数据拆成多段。
- 性能提示:以上两种方法都是基于库底层优化过的C实现逻辑,比纯Python手写逐行判断、拼接临时数组的方案快数十倍,哪怕数据量涨到十万行级别也能快速处理完成。
内容的提问来源于stack exchange,提问作者gmelgkermglermgmrelkgm
相关产品推荐
相关产品推荐

