尝试使用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错误地排在第二位,这是我感到困惑的原因
答案 0 :(得分:0)
编辑:对不起-现在我明白了这个问题...:)
要按不同方向对不同的列进行排序(即一列升序,另一列降序),则可以提供两个by
和ascending
的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)
此后,我的数据框和渠道都处于正确的顺序