我是Pandas的新手,很乐意为我提供一些帮助:
factor
1
1
2
1
1
3
1
2
并产生:
factor running_div
1 1
1 1
2 0.5
1 0.5
1 0.5
3 0.1666667
1 0.1666667
2 0.0833333
我可以通过循环使用.iloc来做到这一点,但是尝试使用矢量数学来提高效率。看过滚动窗口并使用.shift(1),但无法正常工作。希望任何人都能提供任何指导。
答案 0 :(得分:2)
您可以尝试以下方法:
import pandas as pd
df=pd.DataFrame([1,1,2,1,1,3,1,2], columns=["factor"])
df["running_div"]=df["factor"].iloc[0]
df["running_div"].loc[df.index[1:]]=1/df["factor"].loc[df.index[1:]]
df["running_div"]=df["running_div"].cumprod()
print(df)
输出:
factor running_div
0 1 1.000000
1 1 1.000000
2 2 0.500000
3 1 0.500000
4 1 0.500000
5 3 0.166667
6 1 0.166667
7 2 0.083333
[Program finished]
答案 1 :(得分:2)
使用numpy ufunc.accumulate
df['cum_div'] = np.divide.accumulate(df.factor.to_numpy())
factor cum_div
0 1 1.000000
1 1 1.000000
2 2 0.500000
3 1 0.500000
4 1 0.500000
5 3 0.166667
6 1 0.166667
7 2 0.083333
答案 2 :(得分:1)
通过保留第一个元素来进行累加除法,然后将它们乘以所有下一个元素的倒数,直到末尾为止。
因此,使用np.cumprod
df['division'] = np.cumprod([df.factor.iloc[0], *1/df.factor.iloc[1:]])
factor division
0 1 1.000000
1 1 1.000000
2 2 0.500000
3 1 0.500000
4 1 0.500000
5 3 0.166667
6 1 0.166667
7 2 0.083333