使用Python for循环获取滚动和乘积



我正在尝试使用for循环来计算值列表和反向计数器的尾和乘积。也就是说,在循环的每次迭代中,当前值将乘以1,先前值将乘以2,依此类推,返回n个值,其中n是列表开始和当前迭代之间的值的数目。

下面的屏幕截图显示了我如何使用SUMPRODUCT:在Excel中完成这项工作

Excel 中的SUMPRODUCT

在Python中,我可以使用Numpy中的cumsum来返回值列表的滚动累积和:

import numpy as np
import pandas as pd
data = [8,6,7,5,9]
df=pd.DataFrame(data=data,columns=['values'])
values=df['values']
test=[]
for x, index in enumerate(values):
    test.append(np.cumsum(values)[x])

我也可以使用以下内容来获得反向计数器,但我不确定如何将其合并到第一个for循环中,也不确定如何在每次迭代时将反向计数器重置为1:

for i in reversed(range(len(values))):
    print(i+1)

让计数器在循环的每次迭代中重置,并将其合并到后续的sumproduct中,最直接的方法是什么?

提前谢谢。

正如@JonClements所建议的,您可能需要简单的

(df['values'] * range(len(df), 0, -1)).sum()

没有任何for-环路

如果您需要部分结果,那么您可以获得部分行,即sub_df = df[:3]

sub_df = df[:3]
(sub_df['values'] * range(len(sub_df), 0, -1)).sum()

最小工作示例

import pandas as pd
data = [8, 6, 7, 5, 9]
df = pd.DataFrame(data, columns=['values'])
size = 3
sub_df = df[:size]
#result = (sub_df['values'] * range(len(sub_df), 0, -1)).sum()
result = (sub_df['values'] * range(size, 0, -1)).sum()
print(f'result [{size}]: {result}')
size = 4
sub_df = df[:size]
#result = (sub_df['values'] * range(len(sub_df), 0, -1)).sum()
result = (sub_df['values'] * range(size, 0, -1)).sum()
print(f'result [{size}]: {result}')

结果:

result [3]: 43
result [4]: 69

编辑:

如果你想把所有的数据帧

import pandas as pd
data = [8, 6, 7, 5, 9]
df = pd.DataFrame(data, columns=['values'])
# ---
size = 3
sub_df = df[:size]
result = (sub_df['values'] * range(size, 0, -1)).sum()
print(f'result [{size}]: {result}')
df['counter C'] = ''  # default value
df.loc[:size-1, 'counter C'] = range(size, 0, -1)
df['result C'] = ''  # default value
df.loc[size-1,'result C'] = result
   
# ---
size = 4
sub_df = df[:size]
result = (sub_df['values'] * range(size, 0, -1)).sum()
print(f'result [{size}]: {result}')
df['counter D'] = ''  # default value
df.loc[:size-1, 'counter D'] = range(size, 0, -1)
df['result D'] = ''  # default value
df.loc[size-1, 'result D'] = result
print(df)

结果:

   values counter C result C counter D result D
0       8         3                  4         
1       6         2                  3         
2       7         1       43         2         
3       5                            1       69
4       9  

最新更新