pandas 为什么我的df.sort_values()不能正确排序数据点?

e5nszbig  于 2023-02-07  发布在  其他
关注(0)|答案(2)|浏览(171)

我有一个数据框,其中包含%中各种投资的回报。sort.values没有正确排序我的回报。例如,我只想简单地查看TEST列的回报按最低到最高排序,反之亦然。请查看测试输出,它不正确。
df.sort_values('TEST')
给出了未正确排序的返回值的输出。Sort values code not in correct order
此外,我有一个问题,它排序正数最低到最高,然后一半下来重新开始负数最低到最高。
我只想让它看起来像下面这样:减百分之三减百分之一减百分之零点五

jpfvwuh4

jpfvwuh41#

使用numpy.lexsort和 * 布尔索引 *:

import numpy as np

arr = np.array([float(x.rstrip("%")) for x in df["TEST"]])
idx = np.lexsort((arr,))
​
df = df.iloc[idx]
​

输出:

print(df)
​
    TEST
0    -3%
1    -1%
2  -0.5%
3     1%
4     2%
5     5%
  • 使用的输入:*
df = pd.DataFrame({"TEST": ["1%", "-3%","-0.5%", "-1%", "5%", "2%"]})

    TEST
0     1%
1    -3%
2  -0.5%
3    -1%
4     5%
5     2%
7vux5j2d

7vux5j2d2#

问题在于字符串的字典顺序不同于自然顺序(1-〉10-〉2 vs 1-〉2-〉10)。
使用sort_valueskey参数的一个选项:

df.sort_values('TEST', key=lambda s: pd.to_numeric(s.str.extract(r'(-?\d+\.?\d*)', expand=False)))

或者:

df.sort_values('TEST', key=lambda s: pd.to_numeric(s.str.rstrip('%')))

输出:

TEST
1    -3%
3    -1%
2  -0.5%
0     1%
5     2%
4     5%

相关问题