我正在处理一个数据框,我想在其中显示某些值的百分比。我将它们计算为十进制值,然后应用格式字符串将其转换为百分比。数据框转换为百分比时,无法正确地对百分比进行排序。
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之前。但是有没有办法对实际百分比进行排序?
答案 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%