2 votes

changer les rangs dans pandas

J'ai une matrice dans un cadre de données Pandas.

print dfMatrix
       0       1      2      3       4
0  10000      10      8     11      10
1     10  100000     13      9      10
2      8      13  10000      9      11
3     11       9      9  10000      12
4     10      10     11     12  100000

Je dois modifier les valeurs des lignes en réduisant chaque valeur de ligne par le minimum de cette ligne (ligne par ligne). Voici le code que j'ai essayé :

def matrixReduction(matrix):
    minRowValues = matrix.min(axis=1)
    for i in xrange(matrix.shape[1]):
        matrix[i][:] = matrix[i][:] - minRowValues[i]
    return matrix

et attendez un résultat comme :

      0     1     2     3     4
 0 9992     2     0     3     2
 1    1 99991     4     0     1
 2    0     5  9992     1     3
 3    2     0     0  9991     3
 4    0     0     1     2 99990

mais j'obtiens ce résultat :

      0      1     2     3      4
0  9992      1     0     2      0
1     2  99991     5     0      0
2     0      4  9992     0      1
3     3      0     1  9991      2
4     2      1     3     3  99990

Il modifie donc les valeurs dans les colonnes et non dans les lignes, Comment puis-je le faire pour les lignes ? thx

3voto

jezrael Points 290608

Vous pouvez soustraire par sub valeurs minimales par rangées par min :

print (df.min(axis=1))
0     8
1     9
2     8
3     9
4    10
dtype: int64

print (df.sub(df.min(axis=1), axis=0))
      0      1     2     3      4
0  9992      2     0     3      2
1     1  99991     4     0      1
2     0      5  9992     1      3
3     2      0     0  9991      3
4     0      0     1     2  99990

J'essaie également de réécrire votre fonction - j'ajoute ix pour la sélection :

def matrixReduction(matrix):
    minRowValues = matrix.min(axis=1)
    for i in range(matrix.shape[1]):
        matrix.ix[i,:] = matrix.ix[i, :] - minRowValues[i]
    return matrix

Horaires :

In [136]: %timeit (matrixReduction(df))
100 loops, best of 3: 2.64 ms per loop

In [137]: %timeit (df.sub(df.min(axis=1), axis=0))
The slowest run took 5.49 times longer than the fastest. This could mean that an intermediate result is being cached.
1000 loops, best of 3: 308 µs per loop

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X