对值和百分比进行排序会造成误差

时间:2019-05-16 09:20:34

标签: python pandas

尝试使用B-1的值返回B的百分比变化。但是,当我运行for循环进行计算时,我从A-B(前两个值)中得到了100%。 这是为您提供更多上下文的参考表

val     pct_of_whole
3612       100.0
2339        65.0
2339        65.0
2208        61.0
1890        52.0
1368        38.0
1365        38.0
1363        38.0
1086        30.0      
1058        29.0

所以从此表中,我试图将百分比变化从3612更改为2339,从2339更改为2339,从2208更改为2339等。

这是我用来执行百分比变化计算的for循环:

  pct_change=[100]
  length = len(df_two['val'])
  for j in range(1,length):
        pct_change.append(int(df_two['val'][j]/df_two['val'][j-1]*100))

在这一点上,我的图表保留了正确的百分比变化。由于我建立了一个显示每个阶段之间下降的漏斗,因此我将值从最小到最大进行了排序

  df_two = df_two.sort_values('val').reset_index(drop=True)

此时,百分比变化开始看起来不准确

val        pct_of_whole      pct_change     
1058           29.0              97
1086           30.0              79
1363           38.0              99
1365           38.0              99
1368           38.0              99
1890           52.0              72
2208           61.0              94
2339           65.0              64
2339           65.0              100
3612           100.0             100

可以理解,这会使我构建的渠道看起来不准确。 我认为,当我按val排序时,百分比变化较大的2339错误地排在第二位,这是我感到困惑的原因

2 个答案:

答案 0 :(得分:0)

编辑:对不起-现在我明白了这个问题...:)

要按不同方向对不同的列进行排序(即一列升序,另一列降序),则可以提供两个byascending的kwarg列表:

df.sort_values(['val', 'pct_change'], ascending=[True, False]).reset_index(drop=True)

    val  pct_of_whole  pct_change
0  1058     29.291251   97.421731
1  1086     30.066445   79.677183
2  1363     37.735327   99.853480
3  1365     37.790698   99.780702
4  1368     37.873754   72.380952
5  1890     52.325581   85.597826
6  2208     61.129568   94.399316
7  2339     64.756368  100.000000
8  2339     64.756368   64.756368
9  3612    100.000000         NaN

IIUC,您的数据帧可以这样完成:

给出一个具有列val的数据框

df

0    3612
1    2339
2    2339
3    2208
4    1890
5    1368
6    1365
7    1363
8    1086
9    1058

pct_of_whole可以通过

计算
df.val/df.val.loc[0]*100

0    100.000000
1     64.756368
2     64.756368
3     61.129568
4     52.325581
5     37.873754
6     37.790698
7     37.735327
8     30.066445
9     29.291251
Name: val, dtype: float64

...而pct_change

df.val/df.val.shift()*100

0           NaN
1     64.756368
2    100.000000
3     94.399316
4     85.597826
5     72.380952
6     99.780702
7     99.853480
8     79.677183
9     97.421731
Name: val, dtype: float64

答案 1 :(得分:0)

所以我注意到在运行for循环之后,数据帧与我想要的顺序相反。

因此,我重置了索引,以为每个值赋予从0-9的索引号。

  df_two = df_two.reset_index()

然后我按索引对数据帧的顺序进行排序,然后再次重置索引-删除该索引。

df_two = df_two.sort_values('index',ascending =False).reset_index(drop=True)

此后,我的数据框和渠道都处于正确的顺序