Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How do I remove and re-sort (reindex) columns after applying style in python pandas?

Tags:

python

pandas

Is there a way to remove columns or rows after applying style in python pandas? And re-sort them?

styled = df.style.apply(colorize, axis=None)
#remove _x columns
yonly = list(sorted(set(styled.columns) - set(df.filter(regex='_x$').columns)))
###Remove columns that end with "_x" here
styled.to_excel('styled.xlsx', engine='openpyxl', freeze_panes=(1,1))

Most things I tried were unavailable, i.e. styled.reindex(columns=yonly) returned AttributeError: 'Styler' object has no attribute 'reindex'

styled.columns = yonly returned AttributeError: 'list' object has no attribute 'get_indexer'

styled = styled[yonly] returns TypeError: 'Styler' object is not subscriptable

Follow-up from Colour specific cells from two columns that don't match, using python pandas style.where (or otherwise) and export to excel

like image 354
Savvas Radevic Avatar asked Oct 21 '25 04:10

Savvas Radevic


1 Answers

After @jezrael's comment to remove columns before styling and colouring, I got my answer :)

The solution was to pass an extra argument, making the original dataframe df available. And coloured the dataframe df_tmp with the "_y" only. :)

df = pd.DataFrame({
    'config_dummy1': ["dummytext"] * 10,
    'a_y': ["a"] * 10,
    'config_size_x': ["textstring"] * 10,
    'config_size_y': ["textstring"] * 10,
    'config_dummy2': ["dummytext"] * 10,
    'a_x': ["a"] * 10
})
df.at[5, 'config_size_x'] = "xandydontmatch"
df.at[9, 'config_size_y'] = "xandydontmatch"
df.at[0, 'a_x'] = "xandydontmatch"
df.at[3, 'a_y'] = "xandydontmatch"
print(df)

def color(x, extra):
    c1 = 'color: #ffffff; background-color: #ba3018'
    df1 = pd.DataFrame('', index=x.index, columns=x.columns)

    #select only columns ends with _x and _y and sorting
    cols = sorted(extra.filter(regex='_x$|_y$').columns)
    #loop by pairs and assign style by mask
    for colx, coly in zip(cols[::2],cols[1::2]):
        #pairs columns 
        m = extra[colx] != extra[coly]
        df1.loc[m, [coly]] = c1
    return df1

yonly = list(sorted(set(df.columns) - set(df.filter(regex='_x$').columns)))
df_tmp = df[yonly]
df_tmp.style.apply(color, axis=None, extra=df).to_excel('styled.xlsx', engine='openpyxl')

Thank you wonderful people of SO! :D

like image 196
Savvas Radevic Avatar answered Oct 22 '25 17:10

Savvas Radevic



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!