pandas) 如何使用 sort_values 中的 kind 选项

3

你好,我想按列中的值对数据框进行排序。 列的值是带有数字的字符串组合。我想按值中的数字进行排序,但要先将其拆分开来。 因此,我搜索了一些模块,以从列表中仅选择数字并在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

3个回答

1

我认为在这里最好使用natsort将列转换为有序分类:

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


0

函数应该使用括号而不是方括号调用,请尝试使用:

df.sort_values(by=[Xlabel], inplace=True, kind=natural_keys(list(df[Xlabel])))

谢谢回答。我已经尝试过了,但以下信息没有起作用。 - dideod98
返回 _compile(pattern, flags).split(string, maxsplit) 类型错误:期望字符串或类似字节的对象。 - dideod98

0

pandas 1.1.0更新:sort_values现在有key参数:

df.sort_values('Xlabel', key=lambda x: x.str.extract('(\d+)').squeeze().astype(int))

输出:

  Xlabel
0     D1
1     D2
2     D3
3     D4
4     D5
5    D10
6    D11

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接