熊猫根据不同的值移动以计算百分比

时间:2018-08-10 00:33:45

标签: python pandas dataframe

我正在尝试从数据框中计算首个向下的百分比。

这是数据框

        down  distance
1        1.0      10.0
2        2.0      13.0
3        3.0      15.0
4        3.0      20.0
5        4.0       1.0
6        1.0      10.0
7        2.0       9.0
8        3.0       3.0
9        1.0      10.0

我想计算从头向下的百分比,即从头向下的百分比,即获得的码数百分比。对于第三倒,第三的性能基于第一。

例如,我想要以下输出。

        down  distance    percentage

1        1.0      10.0    NaN
2        2.0      13.0    (13-10)/13
3        3.0      15.0    (15-10)/15
4        3.0      20.0    (20-10)/20
5        4.0       1.0    (1-10)/20
6        1.0      10.0    NaN       # New calculation
7        2.0       9.0    (9-10)/9
8        3.0       3.0    (3-10)/3
9        1.0      10.0    NaN

谢谢

当前解决方案对于第一个问题都可以正常工作。

4 个答案:

答案 0 :(得分:5)

这是向量化的解决方案:

# define condition
cond = df['down'] == 1

# calculate value to subtract
first = df['distance'].where(cond).ffill().mask(cond)

# perform calculation
df['percentage'] = (df['distance'] - first) / df['distance']

print(df)

   down  distance  percentage
1   1.0      10.0         NaN
2   2.0      13.0    0.230769
3   3.0      15.0    0.333333
4   3.0      20.0    0.500000
5   4.0       1.0   -9.000000
6   1.0      10.0         NaN
7   2.0       9.0   -0.111111
8   3.0       3.0   -2.333333
9   1.0      10.0         NaN

答案 1 :(得分:2)

使用groupbytransform

s = df.groupby(df.down.eq(1).cumsum()).distance.transform('first')
s = df.distance.sub(s).div(df.distance)
df['percentage'] = s.mask(s.eq(0))

   down  distance  percentage
1   1.0      10.0         NaN
2   2.0      13.0    0.230769
3   3.0      15.0    0.333333
4   3.0      20.0    0.500000
5   4.0       1.0   -9.000000
6   1.0      10.0         NaN
7   2.0       9.0   -0.111111
8   3.0       3.0   -2.333333
9   1.0      10.0         NaN

答案 2 :(得分:2)

带小块

应该很活泼!

<div>
    @await Component.InvokeAsync("MyViewComponent")
</div>

答案 3 :(得分:1)

每次down等于1时,使用groupby进行分组,然后使用所需的计算进行变换。然后,您可以找到down再次为1的位置,然后转换为NaN(因为按照您的示例,计算在那里毫无意义):

df['percentage'] = (df.groupby(df.down.eq(1).cumsum())['distance']
                .transform(lambda x: (x-x.iloc[0])/x))


df.loc[df.down.eq(1),'percentage'] = np.nan

>>> df
   down  distance  percentage
1   1.0      10.0         NaN
2   2.0      13.0    0.230769
3   3.0      15.0    0.333333
4   3.0      20.0    0.500000
5   4.0       1.0   -9.000000
6   1.0      10.0         NaN
7   2.0       9.0   -0.111111
8   3.0       3.0   -2.333333
9   1.0      10.0         NaN