Follow

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use
Contact

Sort column names using wildcard using pandas

I have a big dataframe with more than 100 columns. I am sharing a miniature version of my real dataframe below

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

I would like to do the below

a) sort the column names based on Quarters (ex:Q1,Q2,Q3,Q4,Q5..Q100..Q1000) for each column pattern

MEDevel.com: Open-source for Healthcare and Education

Collecting and validating open-source software for healthcare, education, enterprise, development, medical imaging, medical records, and digital pathology.

Visit Medevel

b) By column pattern, I mean the keyword that is before underscore which is rev and tx.

So, I tried the below but it doesn’t work and it also shifts the ID column to the back

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

I expect my output to be like as below. In real time, there are more than 100 columns with more than 30 patterns like rev, tx etc. I want my ID column to be in the first position as shown below.

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

>Solution :

For the provided example, df.sort_index(axis=1) should work fine.

If you have Q values higher that 9, use natural sorting with natsort:

from natsort import natsort_key

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

Or using manual sorting with 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]
Add a comment

Leave a Reply

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use

Discover more from Dev solutions

Subscribe now to keep reading and get access to the full archive.

Continue reading