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

如何对DataFrame中各物料分组运行自定义均值计算函数并返回字典结果

扩展自定义均值函数到所有物料的实现方法

我来帮你搞定这个问题!你已经掌握了单个物料的处理逻辑,把它扩展到所有唯一物料其实很简单,这里有两种实用的方法,你可以根据自己的理解和需求选择:

方法一:基于现有逻辑的循环遍历(直观易理解)

这种方法直接在你现有单个物料调用代码的基础上,遍历所有唯一物料,把结果整理成目标字典,非常容易上手:

import pandas as pd

# 你的原始数据和函数
data = {'material': [1,1,1,1,2,2,2,2,3,3,3,3], 'week': [5,6,7,8,5,6,7,8,5,6,7,8], 'demand': [20,5,0,15,4,3,8,9,15,74,12,3]}
df = pd.DataFrame.from_dict(data)

def get_means(input_list):
    means = []
    weeks = []
    # 先转成list,避免修改原输入对象的副作用
    lst = list(input_list)
    for i in range(len(lst)-1):
        mean = sum(lst) / len(lst)
        lst = lst[1:]
        means.append(mean)
        weeks.append(len(lst)+1)
    return (weeks, means)

# 初始化结果字典
result_dict = {}

# 遍历每个唯一物料
for material in df['material'].unique():
    # 获取当前物料的需求列表
    demand_list = df[df['material'] == material]['demand']
    # 调用你的函数
    weeks, means = get_means(demand_list)
    # 将结果存入字典
    result_dict[material] = {
        'weeks': weeks,
        'means': means
    }

print(result_dict)

输出结果:

{
  1: {'weeks': [4, 3, 2], 'means': [10.0, 6.666666666666667, 7.5]},
  2: {'weeks': [4, 3, 2], 'means': [6.0, 6.666666666666667, 8.5]},
  3: {'weeks': [4, 3, 2], 'means': [26.0, 29.666666666666668, 4.5]}
}

方法二:Pandas分组式实现(更简洁高效)

如果你想更贴合Pandas的风格,用groupby结合apply来处理,代码更简洁,处理大数据量时效率也更高:

import pandas as pd

data = {'material': [1,1,1,1,2,2,2,2,3,3,3,3], 'week': [5,6,7,8,5,6,7,8,5,6,7,8], 'demand': [20,5,0,15,4,3,8,9,15,74,12,3]}
df = pd.DataFrame.from_dict(data)

# 修改函数,让它返回DataFrame,方便分组合并
def get_means(input_list):
    means = []
    weeks = []
    lst = list(input_list)
    for i in range(len(lst)-1):
        mean = sum(lst) / len(lst)
        lst = lst[1:]
        means.append(mean)
        weeks.append(len(lst)+1)
    # 返回包含weeks和means的DataFrame
    return pd.DataFrame({'weeks': weeks, 'means': means})

# 按物料分组,对每个组的demand列应用函数
grouped_result = df.groupby('material')['demand'].apply(get_means).reset_index()
# 移除自动生成的多余索引列
grouped_result = grouped_result.drop(columns='level_1')

# 如果需要转成目标字典格式
result_dict = grouped_result.groupby('material').apply(lambda x: {
    'weeks': x['weeks'].tolist(),
    'means': x['means'].tolist()
}).to_dict()

print(result_dict)

说明:

  • 我们修改了get_means函数,让它返回一个小DataFrame,这样groupby.apply之后能自动把每个物料的结果合并成一个大DataFrame。
  • 最后通过groupby和lambda把DataFrame转成你需要的字典格式。

两种方法都能达到你的需求,第一种更适合你现在的理解阶段,第二种是更专业的Pandas用法,你可以根据情况选择~

内容的提问来源于stack exchange,提问作者ursteiner

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 15:17:47