![](/img/trans.png)
[英]How to sort dataframe based on column whose entries consist of letters and numbers?
[英]pandas sort dataframe by column that includes numbers and letters
我需要按一列對 dataframe 進行排序,其中包括數字和字母的組合。
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))
它返回排序后的 dataframe,但所有值都已替換為 NaN。
df.iloc(natsorted(df.name))
它引發了一個錯誤:
TypeError: unhashable type: 'list'
為了稍微糾正 Quang 的評論,這很好用
import natsort
df1.iloc[natsort.index_humansorted(df1.name)]
您可以使用正則表達式並提取數字+字母,對它們進行排序並分配為分類列。
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
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))
Output:
user name
0 seth 1
2 aaron 4B
1 chris 10A
3 dan 10B
您現在還可以執行以下操作(使用 pandas >= 1.1.0):
import natsort
sorted_df = df1.sort_values("name", key=natsort.natsort_keygen())
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.