Изменение формы фрейма данных на основе префиксов столбцов

#python #pandas

#python #pandas

Вопрос:

У меня есть CSV-файл, который я считываю в фрейм данных, который выглядит следующим образом

     Time  AP1  AQ1  AP2  AQ2  AP3  AQ3  AP4  AQ4  AP5  AQ5
0   2000  100   10  300   30  500   50  700   70  900   90
1   2001  105   15  305   35  505   55  705   75  905   95
2   2002  110   20  310   40  510   60  710   80  910  100
3   2003  115   25  315   45  515   65  715   85  915  105
4   2004  120   30  320   50  520   70  720   90  920  110
5   2005  125   35  325   55  525   75  725   95  925  115
  

Как мне изменить форму фрейма данных без использования циклов таким образом, чтобы у меня были только столбцы Time, AP и AQ?

     Time  AP    AQ
0   2000  100   10
0   2000  300   30
0   2000  500   50  
0   2000  700   70
0   2000  900   90
1   2001  105   15
....

  

Заранее благодарю вас за любые советы.

Ответ №1:

Вы можете использовать pd.wide_to_long настройку AP и AQ как stubnames :

 (pd.wide_to_long(df, stubnames=['AP','AQ'], i='Time', j='j')
   .droplevel(1).reset_index())

    Time   AP   AQ
0   2000  100   10
1   2001  105   15
2   2002  110   20
3   2003  115   25
4   2004  120   30
5   2005  125   35
6   2000  300   30
7   2001  305   35
8   2002  310   40
9   2003  315   45
10  2004  320   50
11  2005  325   55
12  2000  500   50
13  2001  505   55
14  2002  510   60
15  2003  515   65
  

Обновить

Для Time столбца с дубликатами вы можете сделать:

 (pd.wide_to_long(df.reset_index(), stubnames=['AP','AQ'], i='index', j='j')
  .reset_index(drop=True))

    Time  AP   AQ
0   2000  100   10
1   2000  105   15
2   2002  110   20
3   2003  115   25
4   2004  120   30
5   2005  125   35
6   2000  300   30
7   2000  305   35
8   2002  310   40
9   2003  315   45
10  2004  320   50
11  2005  325   55
12  2000  500   50
  

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

1. Спасибо!! Однако следующий вопрос: я понимаю, что мои данные могут не иметь уникального времени для каждой строки, т. Е. как первая, так и вторая строки могут иметь время 2000. В этом случае я получил сообщение об ошибке «переменные id должны однозначно идентифицировать каждую строку». Я пробовал несколько способов, но не смог решить эту проблему. У вас есть какие-либо предложения?