我的数据框是这种形式
material
15N 649.7
16S 703.2
16N 711.7
1S 716.2
1N 724.5
2S 723.5
2N 721.5
我想对前两个数字而不是我使用的第一个数字进行索引排序 像这样的代码
runn1.sort_index(axis=0, inplace=True)
它按首个数字而不是前两个数字排序,我喜欢数据变成这样
1S 716.2
1N 724.5
2S 723.5
2N 721.5
15N 649.7
16S 703.2
16N 711.7
我正在尝试对“ S”和“ N”之前的数字进行排序,此外,如果有联系,我希望他们解决,首先以“ S”结尾的数字解决。因此,在上面的示例中,“ 1S”高于“ 1N”。
如何获取这种形式的数据?
答案 0 :(得分:1)
要处理所有“ S”都在“ N”之前的附加要求,请使用natsort
模块,并将key=...
参数传递给natsorted
:
natsorted(df.index, lambda x: (x[:-1], x[-1] == 'N'))
# ['1S', '1N', '2S', '2N', '15N', '16S', '16N']
df.loc[natsorted(df.index, lambda x: (x[:-1], x[-1] == 'N'))]
material
1S 716.2
1N 724.5
2S 723.5
2N 721.5
15N 649.7
16S 703.2
16N 711.7
natsort
对于自然排序问题更通用,并且是在这种情况下的便捷工具。可以使用PyPi完成安装。
如果“ S”和“ N”的顺序并不重要,请考虑使用argsort
来提高性能:
df.iloc[df.index.str[:-1].astype(int).argsort()]
或者,
df.iloc[np.argsort([int(x[:-1]) for x in df.index])]
material
1S 716.2
1N 724.5
2S 723.5
2N 721.5
15N 649.7
16S 703.2
16N 711.7
答案 1 :(得分:1)
IIUC natsorted
和reindex
from natsort import natsorted
df.reindex(natsorted(df.index))
material
1N 724.5
1S 716.2
2N 721.5
2S 723.5
15N 649.7
16N 711.7
16S 703.2
更新
l=sorted(df.index.str.split('(\d+)([A-z]+)').tolist(), key = lambda x: (-int(x[1]), x[2]))
df.reindex([''.join(x) for x in l ]).iloc[::-1]
material
1S 716.2
1N 724.5
2S 723.5
2N 721.5
15N 649.7
16S 703.2
16N 711.7