我需要按一列对数据框进行排序,其中包括数字和字母的组合。
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'
答案 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)
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