Pandas, melt, unmelt preserve index

У меня есть таблица клиентов (coper) и распределения активов (asset)

A = [[1,2],[3,4],[5,6]]
idx = ['coper1','coper2','coper3']
cols = ['asset1','asset2']

df = pd.DataFrame(A,index = idx, columns = cols)

так мои данные выглядят как

        asset1  asset2
coper1       1       2
coper2       3       4
coper3       5       6

и я хочу запустить их через линейную оптимизацию (у меня есть ограничения вроде sum of all of asset_i <= amount_on_hand_i и sum of coper_j = price_j)

поэтому мне нужно превратить эту 2D-матрицу в 1D-вектор. Что легко с расплавом

df2 = pd.melt(df,value_vars=['asset1','asset2'])

Но теперь, когда я пытаюсь его расплавить, у меня получается массив из 6 рядов с большим количеством пробелов!

df2.pivot(columns = 'variable', values = 'value')


variable  asset1  asset2
0            1.0     NaN
1            3.0     NaN
2            5.0     NaN
3            NaN     2.0
4            NaN     4.0
5            NaN     6.0

Есть ли способ сохранить «медную» часть моей индексации при использовании расплава?

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
27
0
21 679
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Вам нужно сохранить значения индекса по reset_index и параметру id_vars:

df2 = pd.melt(df.reset_index(), id_vars='index',value_vars=['asset1','asset2'])
print (df2)
    index variable  value
0  coper1   asset1      1
1  coper2   asset1      3
2  coper3   asset1      5
3  coper1   asset2      2
4  coper2   asset2      4
5  coper3   asset2      6

Затем вращение хорошо работает:

print(df2.pivot(index='index',columns = 'variable', values = 'value'))
variable  asset1  asset2
index                   
coper1         1       2
coper2         3       4
coper3         5       6

Еще одно возможное решение с stack:

df2 = df.stack().reset_index()
df2.columns = list('abc')
print (df2)
        a       b  c
0  coper1  asset1  1
1  coper1  asset2  2
2  coper2  asset1  3
3  coper2  asset2  4
4  coper3  asset1  5
5  coper3  asset2  6

print(df2.pivot(index='a',columns = 'b', values = 'c'))
b       asset1  asset2
a                     
coper1       1       2
coper2       3       4
coper3       5       6

Похоже, что «необязательный аргумент keep_index для метода плавления фрейма данных» попал в версию 1.1: https://github.com/pandas-dev/pandas/issues/17440

Кажется, на самом деле он называется ignore_index: pandas.pydata.org/docs/reference/api/pandas.DataFrame.melt.h‌ tml

Make42 19.06.2021 23:45

установите для ignore_index значение False, чтобы сохранить индекс, например

df = df.melt(var_name=‘species’, value_name=‘height’, ignore_index = False)

Примечание: для этого требуется pandas> = 1.1

normanius 01.01.2021 02:19

Отличный и легкий вариант!

Luis Vargas 17.04.2021 05:43

Другие вопросы по теме