百分比的计算
Calculation on percentage of a percentage
我正在尝试计算百分比的百分比。 per, per1, and per1-per are in percentages
date per per1 per1-per
1/1/2021 0 0 0
2/1/2021 0 0 0
3/1/2021 2 3 1
4/1/2021 0 1 1
5/1/2021 5 1 -4
6/1/2021 0 0 0
我想要的输出是
date per per1 per1-per per_of_per
1/1/2021 0 0 0 0
2/1/2021 0 0 0 0
3/1/2021 2 3 1 1
4/1/2021 0 1 1 1.01
5/1/2021 5 1 -4 0.97
6/1/2021 0 0 0 0.97
如果 per1 and per
之间的差异不为零,那么我正在尝试以通用方式在列 per_of_per
中获得总体影响。
p.s.
- 如果
per1-per = 0
那么per_of_per = 0
- 对于第一个非零值,
per1-per = per_of_per
- 之后如果
per1-per = 0
,
最近的 per_of_per
值如果不是那么 per_of_per
= 最近的
per_of_per+((per1-per)/100)
如果我理解正确,这应该对你有用:
g = (df['per1-per'].shift(1).eq(0) | df['per1-per'].eq(0)).cumsum()
df['per_of_per'] = df['per1-per'].replace(0, np.nan).ffill().fillna(0)
df['per_of_per'] = df.groupby(g)['per1-per'].transform('first') + df['per1-per'].mul(df['per1-per'].shift(1).ne(0).astype(int)).div(100).groupby(g).cumsum()
输出:
>>> df
date per per1 per1-per per_of_per
0 1/1/2021 0 0 0 0.00
1 2/1/2021 0 0 0 0.00
2 3/1/2021 2 3 1 1.00
3 4/1/2021 0 1 1 1.01
4 5/1/2021 5 1 -4 0.97
5 6/1/2021 0 0 0 0.97
这是另一种方式。首先创建一个布尔系列 msk
来跟踪 per1-per
是否为 0(在第一次出现 non-zero 之后,将其余标记为 non-zero)。然后用它给第一个non-zero值赋1,剩下的除以100;最后求累计和:
msk = df['per1-per'].ne(0).cummax()
df['per_of_per'] = (msk.where(lambda x: x.index==x.idxmax(), False) +
df['per1-per'] * msk.shift().fillna(False) / 100).cumsum()
输出:
date per per1 per1-per per_of_per
0 1/1/2021 0 0 0 0.00
1 2/1/2021 0 0 0 0.00
2 3/1/2021 2 3 1 1.00
3 4/1/2021 0 1 1 1.01
4 5/1/2021 5 1 -4 0.97
5 6/1/2021 0 0 0 0.97
我正在尝试计算百分比的百分比。 per, per1, and per1-per are in percentages
date per per1 per1-per
1/1/2021 0 0 0
2/1/2021 0 0 0
3/1/2021 2 3 1
4/1/2021 0 1 1
5/1/2021 5 1 -4
6/1/2021 0 0 0
我想要的输出是
date per per1 per1-per per_of_per
1/1/2021 0 0 0 0
2/1/2021 0 0 0 0
3/1/2021 2 3 1 1
4/1/2021 0 1 1 1.01
5/1/2021 5 1 -4 0.97
6/1/2021 0 0 0 0.97
如果 per1 and per
之间的差异不为零,那么我正在尝试以通用方式在列 per_of_per
中获得总体影响。
p.s.
- 如果
per1-per = 0
那么per_of_per = 0
- 对于第一个非零值,
per1-per = per_of_per
- 之后如果
per1-per = 0
, 最近的per_of_per
值如果不是那么per_of_per
= 最近的per_of_per+((per1-per)/100)
如果我理解正确,这应该对你有用:
g = (df['per1-per'].shift(1).eq(0) | df['per1-per'].eq(0)).cumsum()
df['per_of_per'] = df['per1-per'].replace(0, np.nan).ffill().fillna(0)
df['per_of_per'] = df.groupby(g)['per1-per'].transform('first') + df['per1-per'].mul(df['per1-per'].shift(1).ne(0).astype(int)).div(100).groupby(g).cumsum()
输出:
>>> df
date per per1 per1-per per_of_per
0 1/1/2021 0 0 0 0.00
1 2/1/2021 0 0 0 0.00
2 3/1/2021 2 3 1 1.00
3 4/1/2021 0 1 1 1.01
4 5/1/2021 5 1 -4 0.97
5 6/1/2021 0 0 0 0.97
这是另一种方式。首先创建一个布尔系列 msk
来跟踪 per1-per
是否为 0(在第一次出现 non-zero 之后,将其余标记为 non-zero)。然后用它给第一个non-zero值赋1,剩下的除以100;最后求累计和:
msk = df['per1-per'].ne(0).cummax()
df['per_of_per'] = (msk.where(lambda x: x.index==x.idxmax(), False) +
df['per1-per'] * msk.shift().fillna(False) / 100).cumsum()
输出:
date per per1 per1-per per_of_per
0 1/1/2021 0 0 0 0.00
1 2/1/2021 0 0 0 0.00
2 3/1/2021 2 3 1 1.00
3 4/1/2021 0 1 1 1.01
4 5/1/2021 5 1 -4 0.97
5 6/1/2021 0 0 0 0.97