根据索引自然排序pandas DataFrame

时间:2019-01-16 03:09:33

标签: python-3.x pandas sorting dataframe

我的数据框是这种形式

                       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”。

如何获取这种形式的数据?

2 个答案:

答案 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 natsortedreindex

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