熊猫按包括数字和字母的列对数据框进行排序

时间:2020-06-17 14:35:49

标签: python pandas

我需要按一列对数据框进行排序,其中包括数字和字母的组合。

df = [{"user": "seth",
       "name": "1"},
     {"user" : "chris",
       "name": "10A"},
     {"user" : "aaron",
       "name": "4B"},
     {"user" : "dan",
       "name": "10B"}]

我的代码:

df1 = df.sort_values(by=['name'])

这让我:

df1 = [{"user": "seth",
       "name": "1"},
     {"user" : "chris",
       "name": "10A"},
     {"user" : "dan",
       "name": "10B"},
     {"user" : "aaron",
       "name": "4B"}]

我想要:

df1 =    [{"user": "seth",
           "name": "1"},
         {"user" : "aaron",
           "name": "4B"},
         {"user" : "chris",
           "name": "10A"},
         {"user" : "dan",
           "name": "10B"}]

我有一个被标记为类似问题的不同问题,以及他们的代码:

   df.reindex(index=natsorted(df.name))

它返回一个排序的数据帧,但是所有值都已被NaN取代。

  df.iloc(natsorted(df.name))

它引发一个错误:

TypeError: unhashable type: 'list'

3 个答案:

答案 0 :(得分:1)

要稍微纠正Quang的评论,效果很好

import natsort

df1.iloc[natsort.index_humansorted(df1.name)]

答案 1 :(得分:0)

您可以使用正则表达式提取数字和字母,对其进行排序,然后将其分配为分类列。

s = df["name"].str.extract("(\d+)?(\w|)")
s[0]= s[0].astype(int)

print(s)

   0  1
0   1   
1  10  A
2   4  B
3  10  B



df['name'] = pd.Categorical(df['name'],s.sort_values([0,1]).astype(str).agg(''.join,axis=1))


print(df.sort_values('name')

   user name
0   seth    1
2  aaron   4B
1  chris  10A
3    dan  10B

答案 2 :(得分:0)

使用熊猫1.1.0+ sort_values更新现在具有关键参数:

df = pd.DataFrame([{"user": "seth",
       "name": "1"},
     {"user" : "chris",
       "name": "10A"},
     {"user" : "aaron",
       "name": "4B"},
     {"user" : "dan",
       "name": "10B"}])

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

输出:

    user name
0   seth    1
2  aaron   4B
1  chris  10A
3    dan  10B