Как перевернуть имена столбцов pandas на многоуровневом сглаживании столбцов

#arrays #pandas #string #dataframe

#массивы #pandas #строка #фрейм данных

Вопрос:

У меня есть следующий фрейм данных,

                        AirPressure...                            WindDirection    
Date       Location1   Location2.......Location8593 Location8594 Location8595
2010-01-01 xxx.        xxx             xxx          xxx.         xxx.                
2010-01-02 xxx.        xxx             xxx          xxx.         xxx.              
2010-01-03 xxx.        xxx             xxx          xxx.         xxx.               
....
2010-01-01 xxx.        xxx             xxx          xxx.         xxx.              
...
2020-10-10 xxx.        xxx             xxx          xxx.         xxx.               
  

Я пытаюсь превратить его в приведенный ниже.

 Date       AirPressure-Location1 SoilMoisture-Location1.....WindDirection-Location8595
2010-01-01 xxx.                  xxx                        xxx
......
2020-10-10 xxx.                  xxx                        xxx

  

Я запускаю следующую команду,

 frame.columns = ['-'.join(col).strip() for col in frame.columns.values]
  

Но вместо этого я получаю,

 Date       Location1-AirPressure Location1-SoilMoisture.....Location8595-WindDirection
2010-01-01 xxx.                  xxx                        xxx
......
2020-10-10 xxx.                  xxx                        xxx

  

Как мне перевернуть имена, как я хочу выше?

Ответ №1:

Вы можете использовать f-string s:

 frame.columns = [ f'{b}-{a}' for a, b in frame.columns]
  

Или измените порядок столбцов путем индексации:

 frame.columns = ['-'.join(col[::-1]).strip() for col in frame.columns]
  

Или:

 frame = frame.swaplevel(1, 0, axis=1)
frame.columns = ['-'.join(col).strip() for col in frame.columns]
  

Комментарии:

1. есть ли разница в. используя frame.columns и frame.columns.values?

2. @anarchy — если использовать frame.columns.values его, преобразуйте столбцы в массив numpy, но это не обязательно, потому что работает так же, как frame.columns и, поэтому опущено, потому что упрощенное решение.