簡體   English   中英

pandas 按包含數字和字母的列對 dataframe 進行排序

[英]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

使用 pandas 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))

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM