#python #pandas #database #dataframe
Вопрос:
У меня есть таблица клиентов (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
Есть ли какой-либо способ сохранить «коперную» часть моей индексации при использовании melt?
Ответ №1:
Вам нужно сохранить значения индекса по 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
Ответ №2:
установите значение ignore_index равным False, чтобы сохранить индекс, например
df = df.melt(var_name=‘species’, value_name=‘height’, ignore_index = False)
Комментарии:
1. Примечание: Для этого требуются панды >= 1.1
2. Отличный и простой вариант!
Ответ №3:
Похоже, что «необязательный аргумент keep_index для метода расплава фрейма данных» попал в выпуск 1.1: https://github.com/pandas-dev/pandas/issues/17440
Комментарии:
1. Похоже, на самом деле это называется «ignore_index»: pandas.pydata.org/docs/reference/api/pandas. DataFrame.melt.html