web-dev-qa-db-fra.com

pandas, fondre, indice de conservation inaltérable

J'ai une table de clients (coper) et d'allocation d'actifs (atout)

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

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

donc mes données ressemblent

        asset1  asset2
coper1       1       2
coper2       3       4
coper3       5       6

et je veux les exécuter à travers une optimisation linéaire (j'ai des contraintes - quelque chose comme sum of all of asset_i <= amount_on_hand_i et sum of coper_j = price_j)

je dois donc transformer cette matrice 2D en un vecteur 1D. Ce qui est facile avec la fonte

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

Mais maintenant, quand j'essaye de le faire fondre, j'obtiens un tableau à 6 rangées avec beaucoup de blancs!

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

Existe-t-il un moyen de préserver la partie "coper" de mon indexation lors de l'utilisation de la fusion?

7
Mohammad Athar

Vous devez conserver les valeurs d'index par reset_index et le paramètre 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

Pivotez ensuite en travaillant Nice:

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

Une autre solution possible avec 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
15
jezrael