簡體   English   中英

對df.columns的數字重新排序

[英]Re-ordering df.columns alpha numerically

我有一個DF,如下所示:

        Store   Spend_1 Spend_2 Spend_3 Spend_4 Variance_1  Variance_2  Variance_3  Variance_4
0   1   200 230 189 200 -14 16  -6  18
1   2   224 104 240 203 -17 -11 17  -18
2   3   220 168 131 210 10  -9  12  19
3   4   143 187 139 188 -1  -17 -20 -9
4   5   179 121 162 131 6   -25 5   20
5   6   208 158 140 191 16  -14 -22 -6

我正在嘗試對列名稱應用自定義排序,以便對其進行排序:

    Store   Spend_1 Variance_1  Spend_2 Variance_2  Spend_3 Variance_3  Spend_4 Variance_4
0   1   200 -14 230 16  189 -6  200 18
1   2   224 -17 104 -11 240 17  203 -18
2   3   220 10  168 -9  131 12  210 19
3   4   143 -1  187 -17 139 -20 188 -9
4   5   179 6   121 -25 162 5   131 20
5   6   208 16  158 -14 140 -22 191 -6

我嘗試了簡單sorted但顯然這適用於字母順序,忽略了最后的整數。

我玩的周圍enumeratingnumbercolsdf.columns改變字符串整數,應用排序,然后在使用數字iloc ,但我不知道如何應用自定義排序的方式。

有人能幫忙嗎?

思想是使用key由2個值parameetr -值之后_轉換為inetegr之前與第一數值• _ ,但溶液是適用於所有列,而不先與df.columns[1:] ,所以最后加入第一塔由df.columns[:1].tolist()

cols = df.columns[:1].tolist() +sorted(df.columns[1:], 
                                       key=lambda x: (int(x.split('_')[1]), x.split('_')[0]))

df = df[cols]
print (df)
   Store  Spend_1  Variance_1  Spend_2  Variance_2  Spend_3  Variance_3  \
0      1      200         -14      230          16      189          -6   
1      2      224         -17      104         -11      240          17   
2      3      220          10      168          -9      131          12   
3      4      143          -1      187         -17      139         -20   
4      5      179           6      121         -25      162           5   
5      6      208          16      158         -14      140         -22   

   Spend_4  Variance_4  
0      200          18  
1      203         -18  
2      210          19  
3      188          -9  
4      131          20  
5      191          -6  

您可以將key t傳遞給sorted來進行自己的自定義排序:

sorted_columns = sorted(df.columns, key = lambda col: col[-1] + col[:-1])
df[sorted_columns]

想法是將最終整數放在第一位。 如果您可以輸入兩位數,則會細分。

這是一種拆分_上的列,反轉結果列表的方法,以便進一步排序優先於尾隨數字並使用pandas.Index.argsort

df.iloc[:,[0]+[*df.columns.str.split('_').str[::-1].argsort()[:-1]]]

     Store  Spend_1  Variance_1  Spend_2  Variance_2  Spend_3  Variance_3  \
0      1      200         -14      230          16      189          -6   
1      2      224         -17      104         -11      240          17   
2      3      220          10      168          -9      131          12   
3      4      143          -1      187         -17      139         -20   
4      5      179           6      121         -25      162           5   
5      6      208          16      158         -14      140         -22   

     Spend_4  Variance_4  
0      200          18  
1      203         -18  
2      210          19  
3      188          -9  
4      131          20  
5      191          -6  

我能想到的最簡單的方法是定義您自己的排序鍵

df = df.reindex(sorted(df.columns, key=lambda x: int(x.split("_")[1]) if "_" in x else 0), axis=1) 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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