熊猫专栏专栏

时间:2019-11-09 21:17:49

标签: python pandas

我是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),但无法正常工作。希望任何人都能提供任何指导。

3 个答案:

答案 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