You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何高效对DataFrame各独立分类分别应用自定义函数?

高效批量处理多分类DataFrame的自定义函数应用

问题背景

现有如下结构的Pandas DataFrame,包含category、value、time三列:

categoryvaluetime
A410:15
B510:20
B512:30
Z612:45
S513: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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 08:15:35