熊猫-sort_values无法正确排序转换后的浮动百分比

时间:2020-10-16 08:55:12

标签: python pandas

我正在处理一个数据框,我想在其中显示某些值的百分比。我将它们计算为十进制值,然后应用格式字符串将其转换为百分比。数据框转换为百分比时,无法正确地对百分比进行排序。

d = {'name': ['A', 'B', 'C', 'D', 'E'], 'percentage':[0.15, 0.65, 0.7, 0.3, 1]}
test_df = pd.DataFrame(data = d)
test_df

name    percentage
0   A   0.15
1   B   0.65
2   C   0.70
3   D   0.30
4   E   1.00

当使用sort_values函数对上面的值进行排序时,我们收到:

test_df.sort_values('percentage')

    name    percentage
0   A   0.15
3   D   0.30
1   B   0.65
2   C   0.70
4   E   1.00

然后我将小数转换为百分比(这主要是为了图形中的可视化目的)并尝试对其进行排序,这一次是上升的,因为我的数据集有几百行,我只想显示前10位: / p>

perc_sort = test_df
perc_sort['percentage'] = perc_sort['percentage'].astype(float).map("{:.2%}".format)
perc_sort.sort_values('percentage', ascending=False)

name    percentage
2   C   70.00%
1   B   65.00%
3   D   30.00%
0   A   15.00%
4   E   100.00%

为什么底部100%?我猜字符串有问题,可能是0在数字1之前。但是有没有办法对实际百分比进行排序?

1 个答案:

答案 0 :(得分:2)

您需要对整数排序,否则数字排序错误-'100' <5,因为'1' <'5'

perc_sort.sort_values('percentage', ascending=False)
perc_sort['percentage'] = perc_sort['percentage'].astype(float).map("{:.2%}".format)

如果值已经是字符串,则可以创建由数字填充并按其排序的帮助器列:

perc_sort = test_df.copy()
perc_sort['percentage'] = perc_sort['percentage'].astype(float).map("{:.2%}".format)

perc_sort['new'] = perc_sort['percentage'].str.strip('%').astype(float)
df = perc_sort.sort_values('new', ascending=False)

print(df)
  name percentage    new
4    E    100.00%  100.0
2    C     70.00%   70.0
1    B     65.00%   65.0
3    D     30.00%   30.0
0    A     15.00%   15.0

或者将Series.argsort[::-1]一起使用,以获取降序排序后的值的索引并传递到DataFrame.iloc

new = perc_sort['percentage'].str.strip('%').astype(float)
df = perc_sort.iloc[new.argsort()[::-1]]

print(df)
  name percentage
4    E    100.00%
2    C     70.00%
1    B     65.00%
3    D     30.00%
0    A     15.00%