首页 > 解决方案 > 在数据框列的行组上运行 python 函数,返回字典

问题描述

我正在使用这个 df:

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)

我有一个函数可以遍历输入列表,计算平均值并从列表中删除第一个元素。我使用这个函数来计算过去 4,3,2... 周的平均需求

def get_means(input_list):
    means = []
    weeks = []
    for i in range(len(input_list)-1):
        mean = sum(input_list) / len(input_list) # calculate the mean from input list and store in mean
        input_list = input_list[1:] # remove first value from input list
        means.append(mean) # append mean to list means
        weeks.append(len(input_list)+1) # append number of weeks used to calculate mean to list weeks
    return (weeks, means)

我缺少“扩展”该功能的技能。现在我只在 df 中的一个材料上调用函数,在这个例子中是第一个材料(df 总是按材料周排序)

input_list = df[df["material"]==df.material.unique()[0]]["demand"]

这给了我

out = get_means(input_list)
print(out)

([4, 3, 2], [10.0, 6.666666666666667, 7.5])

我想为 df 中的每种独特材料调用该函数。理想情况下,输出应该是包含材料、周数和方法的字典。

如果有人能在这里指出我正确的方向,那就太好了。谢谢你。

标签: pythonpandas

解决方案


创建一个空字典并为每个唯一值不断添加

l = df.material.unique()
d = {}
for i in l:
    d[i] = get_means(df.loc[df['material'].eq(i),'demand'])

print(d)

{1: ([4, 3, 2], [10.0, 6.666666666666667, 7.5]),
 2: ([4, 3, 2], [6.0, 6.666666666666667, 8.5]),
 3: ([4, 3, 2], [26.0, 29.666666666666668, 7.5])}

推荐阅读