簡體   English   中英

使用 pandas 使用通配符對列名進行排序

[英]Sort column names using wildcard using pandas

我有一個很大的 dataframe,有 100 多列。 我在下面分享我的真實 dataframe 的微型版本

ID  rev_Q1   rev_Q5     rev_Q4    rev_Q3   rev_Q2  tx_Q3   tx_Q5  tx_Q2  tx_Q1  tx_Q4
1     1        1         1         1        1       1       1      1       1       1
2     1        1         1         1        1       1       1      1       1       1

我想做以下

a) 根據季度(例如:Q1、Q2、Q3、Q4、Q5..Q100..Q1000)為每個列模式對列名稱進行排序

b)按列模式,我的意思是下划線之前的關鍵字,即revtx

所以,我嘗試了下面的方法,但它不起作用,它還會將ID列移到后面

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

我希望我的 output 如下所示。 在實時中,有超過 100 列具有超過 30 種模式,如revtx等。我希望我的ID列在第一個 position 中,如下所示。

ID  rev_Q1   rev_Q2     rev_Q3    rev_Q4   rev_Q5  tx_Q1   tx_Q2  tx_Q3  tx_Q4  tx_Q5
1     1        1         1         1        1       1       1      1       1       1
2     1        1         1         1        1       1       1      1       1       1

對於提供的示例, df.sort_index(axis=1)應該可以正常工作。

如果您的 Q 值高於 9,請使用natsort自然排序:

from natsort import natsort_key

out = df.sort_index(axis=1, key=natsort_key)

或者使用np.lexsort手動排序:

idx = df.columns.str.split('_Q', expand=True, n=1)
order = np.lexsort([idx.get_level_values(1).astype(float), idx.get_level_values(0)])

out = df.iloc[:, order]

就像是:

new_order = list(df.columns)
new_order = ['ID'] + sorted(new_order.remove("ID"))

df = df[new_order]

我們手動將"ID"放在前面,然后對剩余的進行排序

這個想法是從列名創建一個 dataframe。 創建兩列:一列用於變量,另一列用於季度編號。 最后按值對這個 dataframe 進行排序,然后提取索引。

idx = (df.columns.str.extract(r'(?P<V>[^_]+)_Q(?P<Q>\d+)')
         .fillna(0).astype({'Q': int})
         .sort_values(by=['V', 'Q']).index)

df = df.iloc[:, idx]

Output:

>>> df
   ID  rev_Q1  rev_Q2  rev_Q3  rev_Q4  rev_Q5  tx_Q1  tx_Q2  tx_Q3  tx_Q4  tx_Q5
0   1       1       1       1       1       1      1      1      1      1      1
1   2       1       1       1       1       1      1      1      1      1      1

>>> (df.columns.str.extract(r'(?P<V>[^_]+)_Q(?P<Q>\d+)')
         .fillna(0).astype({'Q': int})
         .sort_values(by=['V', 'Q']))
      V  Q
0     0  0
1   rev  1
5   rev  2
4   rev  3
3   rev  4
2   rev  5
9    tx  1
8    tx  2
6    tx  3
10   tx  4
7    tx  5

暫無
暫無

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

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