Как расплавить 2 колонки одновременно?

#python #pandas #numpy #matrix #transpose

Вопрос:

В Pandas у меня есть следующий фрейм данных:

    id1 id2 t1  l1  t2  l2 
0  1   2   a   b   c   d
1  3   4   g   h   i   j
 

Я хотел бы расплавить сразу две колонки. То есть желаемый результат будет:

    id1 id2 tz  lz  
0  1   2   a   b
1  1   2   c   d
2  3   4   g   h
3  3   4   i   j
 

Я знаю стандартную плавку:

 d.melt(id_vars=['id1', 'id2'],
       value_vars=['t1', 't2', 'l1', 'l2'])
 

но это складывает все столбцы

    id1  id2 variable value
0    1    2       t1     a
1    3    4       t1     g
2    1    2       t2     c
3    3    4       t2     i
4    1    2       l1     b
5    3    4       l1     h
6    1    2       l2     d
7    3    4       l2     j
 

Как я мог расплавить две колонки сразу? Что-то вроде:

 d.melt(id_vars=['id1', 'id2'],
       value_vars={('t1', 'l1'): 'tz', ('t2', 'l2'): 'lz'})
 

было бы здорово.

Ответ №1:

Это wide_to_long

 pd.wide_to_long(df,['t','l'],i=['id1','id2'],j='drop').reset_index(level=[0,1])
Out[52]: 
      id1  id2  t  l
drop                
1       1    2  a  b
2       1    2  c  d
1       3    4  g  h
2       3    4  i  j
 

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

1. Какая часть заставляет его выбирать (t1, l1) и (t2, l2), а не (t1, t2) и (l1, l2). Зависит ли это от порядка, в котором столбцы отображаются во фрейме данных? если да, могу ли я уточнить заказ? Спасибо.

2. @гиперио pandas.pydata.org/pandas-docs/stable/reference/api/… , это имена

Ответ №2:

Вы можете использовать melt здесь дважды, а затем объединить их, чтобы получить желаемый результат:

 t = d.melt(id_vars=['id1', 'id2'], value_vars=['t1', 't2'], value_name='tz').drop('variable', axis=1)
l = d.melt(id_vars=['id1', 'id2'], value_vars=['l1', 'l2'], value_name='lz').iloc[:, -1:]

df = pd.concat([t, l], axis=1).sort_values('id1')
 

Выход

 print(df)
   id1  id2 tz lz
0    1    2  a  b
2    1    2  c  d
1    3    4  g  h
3    3    4  i  j