如何对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
相关产品推荐
相关产品推荐

