如何高效对DataFrame各独立分类分别应用自定义函数?
高效批量处理多分类DataFrame的自定义函数应用
问题背景
现有如下结构的Pandas DataFrame,包含category、value、time三列:
| category | value | time |
|---|---|---|
| A | 4 | 10:15 |
| B | 5 | 10:20 |
| B | 5 | 12:30 |
| Z | 6 | 12:45 |
| S | 5 | 13:45 |
已定义自定义函数def op(df):,该函数会针对不同分类的子DataFrame执行特定计算逻辑。此前采用手动逐个过滤分类、应用函数再合并的方式,当分类数量超过50时效率极低:
df_A = df[df.category=='A'] df_A = op(df_A) df_B = df[df.category=='B'] df_B = op(df_B) # ... 省略大量重复代码 df_Z = df[df.category=='Z'] df_Z = op(df_Z) final_df = pd.concat([df_A, df_B, ...., df_Z])
需求:当分类数量超过50个时,如何更高效地对每个分类分别应用该自定义函数?
注:因同一分类下
time列记录存在差异,无法直接使用常规聚合类的groupby操作。
解决方案
方案1:遍历唯一分类批量处理
直接获取所有唯一分类,循环遍历每个分类对应的子DataFrame,应用函数后存入列表,最后一次性合并:
# 获取所有唯一分类 unique_cats = df['category'].unique() # 初始化空列表存储处理后的子DataFrame processed_dfs = [] for cat in unique_cats: # 过滤当前分类的子DataFrame sub_df = df[df['category'] == cat] # 应用自定义函数 processed_sub = op(sub_df) # 添加到列表 processed_dfs.append(processed_sub) # 合并所有处理后的结果 final_df = pd.concat(processed_dfs, ignore_index=True)
这种方法逻辑直观,代码简洁,彻底避免了手动重复编写每个分类的处理代码,适配任意数量的分类场景。
方案2:使用groupby结合apply(修正认知误区)
你提到“因time列存在无法使用groupby”,其实groupby不仅支持聚合操作,还可以对每个分组的完整DataFrame应用自定义函数,完全适配你的场景:
# 按category分组,对每个分组的DataFrame应用op函数,然后合并结果 final_df = df.groupby('category', group_keys=False).apply(op).reset_index(drop=True)
这里group_keys=False用于避免分组键被自动添加为索引列,reset_index则将结果的索引重置为连续整数。这种方法比循环写法更简洁,Pandas内部会做性能优化,执行效率更高。
内容的提问来源于stack exchange,提问作者Datalearner
相关产品推荐
相关产品推荐

