#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