[英]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)按列模式,我的意思是下划線之前的關鍵字,即rev
和tx
。
所以,我嘗試了下面的方法,但它不起作用,它還會將ID
列移到后面
df = df.reindex(sorted(df.columns), axis=1)
我希望我的 output 如下所示。 在實時中,有超過 100 列具有超過 30 種模式,如rev
、 tx
等。我希望我的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.