如何为这个在每个阶段都有移动平均线的 df 创建一个 while 循环? [复制]
Posted
技术标签:
【中文标题】如何为这个在每个阶段都有移动平均线的 df 创建一个 while 循环? [复制]【英文标题】:How do I create a while loop for this df that has moving average in every stage? [duplicate] 【发布时间】:2021-12-26 05:19:35 【问题描述】:因此,我想通过查看平均销售额来逐一分配组中每个 ID 的发货量,以确定将其提供给谁。
这是我的数据框:
ID STOREID BAL SALES SHIP
1 STR1 50 5 18
1 STR2 6 7 18
1 STR3 74 4 18
2 STR1 35 3 500
2 STR2 5 4 500
2 STR3 54 7 500
当 SHIP(按 ID 分组)大于 0 时,计算 AVG (BAL/SALES),每组的最低 AVG 为其 BAL 列 +1,其最终列 +1。然后重复这个过程,直到 SHIP 为 0。每个阶段的 AVG 都会不同,这就是我希望它是一个 while 循环的原因。
第一轮的样本输出如下。所以这样做直到 SHIP 为 0 并且每个 ID 的最终总和 = 到 SHIP:
ID STOREID BAL SALES SHIP AVG Final
1 STR1 50 5 18 10 0
1 STR2 6 4 18 1.5 1
1 STR3 8 4 18 2 0
2 STR1 35 3 500 11.67 0
2 STR2 5 4 500 1.25 1
2 STR3 54 7 500 7.71 0
我在 SQL 中尝试了几种方法,我认为在 python 中这样做会更好,但我的循环并没有做得很好。到目前为止,这是我尝试过的:
df['AVG'] = 0
df['FINAL'] = 0
for i in df.groupby(["ID"])['SHIP']:
if i > 0:
df['AVG'] = df['BAL'] / df['SALES']
df['SHIP'] = df.groupby(["ID"])['SHIP']-1
total = df.groupby(["ID"])["FINAL"].transform("cumsum")
df['FINAL'] = + 1
df['A'] = + 1
else:
df['FINAL'] = 0
【问题讨论】:
您能解释一下您所说的“所以我想将每个 ID 的货件一个一个地分配到组中”是什么意思吗?当示例代码显示整数值时,为什么在预期输出中将 [Final] 列显示为 x?您可以使用不同的数据结构进行迭代计算吗? 所以在最后一列中,我试图通过查看最低的 AVG 列一一分配整个 FINAL 列的 SHIP。我只是使用 X 作为值的占位符。我会编辑它。 【参考方案1】:这很有挑战性,因为组中的多行可以有相同的平均计算。然后它会抛出分配。
如果我理解正确的话,这适用于示例数据框。
d = 'ID': [1, 1, 1, 2,2,2], 'STOREID': ['str1', 'str2', 'str3','str1', 'str2', 'str3'],'BAL':[50, 6, 74, 35,5,54], 'SALES': [5, 7, 4, 3,4,7], 'SHIP': [18, 18, 18, 500,500,500]
df = pd.DataFrame(data=d)
df['AVG'] = 0
df['FINAL'] = 0
def calc_something(x):
# print(x.iloc[0]['SHIP'])
for i in range(x.iloc[0]['SHIP'])[0:500]:
x['AVG'] = x['BAL'] / x['SALES']
x['SHIP'] = x['SHIP']-1
x = x.sort_values('AVG').reset_index(drop=True)
# print(x.iloc[0, 2])
x.iloc[0, 2] = x['BAL'][0] + 1
x.iloc[0, 6] = x['FINAL'][0] + 1
return x
df_final = df.groupby('ID').apply(calc_something).reset_index(drop=True).sort_values(['ID', 'STOREID'])
df_final
ID STOREID BAL SALES SHIP AVG FINAL
1 1 STR1 50 5 0 10.000 0
0 1 STR2 24 7 0 3.286 18
2 1 STR3 74 4 0 18.500 0
4 2 STR1 127 3 0 42.333 92
5 2 STR2 170 4 0 42.500 165
3 2 STR3 297 7 0 42.286 243
【讨论】:
它实际上给了我不同的输出,我做了完全相同的事情吗?我有相似的 ID(即 1) 抱歉,请不要理解这意味着什么:“我有相似的 ID(即 1)”除非您使用的输入数据帧与上面提供的不同,否则不清楚它有何不同。 是的,我用的完全一样,但是循环搞混了?这是我的数据框: d = 'ID': [1, 1, 1, 2,2,2], 'STOREID': ['str1', 'str2', 'str3','str1', 'str2' , 'str3'],'BAL':[50, 6, 74, 35,5,54], '销售': [5, 7, 4, 3,4,7], 'SHIP': [18, 18 , 18, 500,500,500] df = pd.DataFrame(data=d) 当我尝试运行代码时,我得到了 5 行的输出,所有 ID 都为 1,似乎所有 SHIP 都分配给了最小的 avg 而不是散布 用您的数据再次运行它并获得相同的正确结果。您没有移动或添加列? .iloc[0, 2] 很挑剔。寻找特定的行/列。不幸的是,很难说为什么它不适合你。以上是关于如何为这个在每个阶段都有移动平均线的 df 创建一个 while 循环? [复制]的主要内容,如果未能解决你的问题,请参考以下文章
如何为 RHEV-M 安装配置一个离线的软件存储仓库(REPOSITORY)
如何为 Azure Pipelines 中的每个阶段使用不同的服务连接?
我想创建一项服务,允许我公司的产品仅为客户拥有的产品移动页面