28

I know I can rename single pandas.DataFrame columns with:

drugInfo.rename(columns = {'col_1': 'col_1_new_name'}, inplace = True)

But I'd like to rename a column without knowing its name (based on its index - although I know dictionaries don't have it). I would like rename column number 1 like this:

drugInfo.rename(columns = {1: 'col_1_new_name'}, inplace = True)

But in the DataFrame.columns dict there is no '1' entry, so no renaming is done. How could I achieve this?

afrendeiro
  • 2,215
  • 2
  • 21
  • 22

1 Answers1

40

Should work:

drugInfo.rename(columns = {list(drugInfo)[1]: 'col_1_new_name'}, inplace = True)

Example:

In [18]:

df = pd.DataFrame({'a':randn(5), 'b':randn(5), 'c':randn(5)})
df
Out[18]:
          a         b         c
0 -1.429509 -0.652116  0.515545
1  0.563148 -0.536554 -1.316155
2  1.310768 -3.041681 -0.704776
3 -1.403204  1.083727 -0.117787
4 -0.040952  0.108155 -0.092292
In [19]:

df.rename(columns={list(df)[1]:'col1_new_name'}, inplace=True)
df
Out[19]:
          a  col1_new_name         c
0 -1.429509      -0.652116  0.515545
1  0.563148      -0.536554 -1.316155
2  1.310768      -3.041681 -0.704776
3 -1.403204       1.083727 -0.117787
4 -0.040952       0.108155 -0.092292

It is probably more readable to index into the dataframe columns attribute:

df.rename(columns={df.columns[1]:'col1_new_name'}, inplace=True)

So for you:

drugInfo.rename(columns = {drugInfo.columns[1]: 'col_1_new_name'}, inplace = True)
EdChum
  • 339,461
  • 188
  • 752
  • 538
  • thanks, this worked for me regardless of whether that column was named or nameless, which is what I needed. – Nikhil VJ Jun 06 '18 at 07:30
  • For some reason in my case it's renaming all columns that are named like the first column. I have columns: {'Month', ..., 'Month'}. I tried to rename the first column to 'Date', but this approach renames the other column (#9) to 'Date' as well. E.g.: df.rename(columns={df.columns[0]:'Date'}, inplace=True) This renames both column[0] and column[9] to 'Date'. – StudentAtLU Apr 12 '22 at 04:17