![](/img/trans.png)
[英]Sort a subset of columns of a pandas dataframe alphabetically by column name
[英]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.