我正在尝试使用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