簡體   English   中英

Pandas按名稱對列進行排序

[英]Pandas sort columns by name

我有以下數據框,我想根據名稱對列進行排序。

1 | 13_1 | 13_10| 13_2  | 2   | 3
9 |  31  | 2    |  1    | 3   | 4

我試圖按以下方式對列進行排序:

1 |  2  | 3    | 13_1  | 13_2  | 13_10
9 |  3  | 4    |  31   |  1    | 2

我一直在嘗試使用df.sort_index(axis=1, inplace=True)來解決這個問題,但結果卻與我的初始數據幀相同。 即:

1 | 13_1 | 13_10| 13_2  | 2   | 3
9 |  31  | 2    |  1    | 3   | 4

它似乎認為13_1為1.31而不是13.1。 此外,我嘗試將列名從字符串轉換為float。 然而,結果是將13_1和13_10都視為13.1給出了重復的列名。

natsort

from natsort import natsorted

df = df.reindex(natsorted(df.columns), axis=1)

#   1  2  3  13_1  13_2  13_10
#0  9  3  4    31     1      2

這是一種使用natsorted

from natsort import natsorted, ns
df=df.reindex(columns=natsorted(df.columns))
Out[337]: 
   1  2  3  13_1  13_2  13_10
0  9  3  4    31     1      2

我們與pandas堆疊的另一種方式沒有第三方lib :-)

idx=df.columns.to_series().str.split('_',expand=True).astype(float).reset_index(drop=True).sort_values([0,1]).index
df=df.iloc[:,idx]
Out[355]: 
   1  2  3  13_1  13_2  13_10
0  9  3  4    31     1      2

首先,來自其他答案的natsort看起來很棒,我完全使用它。

如果您不想安裝新包:

好像你想要數字排序,首先是_之前的數字,然后是它之后的數字作為平局。 這意味着你只需要一個tuple排序順序,當用_分割為元組時。

嘗試這個:

df = df[sorted(df.columns, key=lambda x: tuple(map(int,x.split('_'))))]

輸出:

1  2  3  13_1  13_2  13_10
9  3  4    31     1      2

暫無
暫無

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

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