python - 在数据框列的行组上运行 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 中的每种独特材料调用该函数。理想情况下,输出应该是包含材料、周数和方法的字典。
如果有人能在这里指出我正确的方向,那就太好了。谢谢你。
解决方案
创建一个空字典并为每个唯一值不断添加
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])}
推荐阅读
- javascript - 如何在动态更改标题标签后显示它
- r - 在 group_by() 之后为非缺失值取一个 count()
- terminology - Mac OS X 中 SIP 的“超出沙箱的代码”是什么意思?
- python - 如何在 Python Flask 中连接到 Teradata
- python - 我们可以在子进程中使用 input() 在参数中赋值吗
- wordpress - 将允许 IP 地址列表包含到特定位置
- react-native - 如何在 React Native(react-native-router-flux)中隐藏特定场景的标签栏?
- java - 在tomcat中为多个war文件分别配置java代理
- xslt - 如果xslt中的条件如何写入行
- spring - 为什么我不能在 Spring Boot 中使用“截断”