No reason to use groupby, you can just use drop and min
To remove a column 21 you can just use drop on the relevant column, removing it by name:
df.drop(columns="column_21_name", inplace=True)
To a select a minimum between several columns you can use min:
df["min_column"] = df.iloc[:, 22:57].min(axis=0)
(First I used iloc to select only relevant columns and then use the minimum omethod)
Maybe it should be 21:56 (if start indexing from 0), depends on how you counted. Just try and see if it is what you desired.
Afterwards you have in df a new column name "min_column" and you drop the rest of the relevant column (21 to 56)
P.S - Please follow StackOverflow Guidelines when publishing a question: You should say what you already try (instead of just asking) and give example of your dataframe (rather then talk generally about "column 20"). I decided to answer this time, but other community members may be less merciful.