嗨,我想按列中的值对数据框进行排序
列的值是带数字的字符串组合。我想按数值按数值排序
因此,我搜索了一些模块以仅从列表中选择数字,然后在sort_values中应用kind选项。.但是它不起作用。.如果没有kind选项,则按“ D1 D10 D11 D2 D3 ..”进行排序。我想要排序'D1 D2 D3 D4..D10 D11'
你能帮助我吗?

python
#我想按D1 D2 D3 D4 D5 D10 D11排序...
df [Xlabel] = ['D1','D2','D3','D4','D5','D10','D11']

 def atoi(text):
  return int(text) if text.isdigit() else text
 def natural_keys(text):
  return [ atoi(c) for c in re.split('(\d+)',text) ]

 # my trying but didn't work with error message like below..
 df.sort_values(by=[Xlabel], inplace=True, kind=natural_keys[list(df[Xlabel])])

 # my trying working well but it didn't sort well
 # It sort by ( D1 D10 D11 D2 D3... ) it's not my hope
 df.sort_values(by=[Xlabel], inplace=True])


#error message when trying my method
df.sort_values(by=[Xlabel], inplace=True, kind=natural_keys[list(df[Xlabel])])
TypeError: 'function' object is not subscriptable

最佳答案

我认为这里最好将natsort与convert列一起使用为有序分类:

df = pd.DataFrame({'Xlabel':['D1','D2','D3','D4','D5','D10','D11']})

import natsort as ns

df['Xlabel'] = pd.Categorical(df['Xlabel'],
                              ordered=True,
                              categories= ns.natsorted(df['Xlabel'].unique()))
df = df.sort_values('Xlabel')
print (df)
  Xlabel
0     D1
1     D2
2     D3
3     D4
4     D5
5    D10
6    D11


我也认为在新版本的Pandas中应该可以使用新的参数key,请检查this

10-07 14:51