Ma trame de données ressemble à ceci

Minutes Played, Points, Assists

      MP   PTS   TRB   AST    FG%  BLK    3P%
0   2810   793   678   117  0.485   74  0.315
1    263   101    30    19  0.402    7  0.385
2   4241  1170  1178   144  0.548  201  0.000

Je veux convertir ce bloc de données en bloc de données avec ces colonnes

Points/Minutes, Assists/Minutes

Fondamentalement, la première colonne est le nombre total de minutes jouées, je veux convertir toutes les statistiques restantes en base par minute.

Bon je fais

 input_data['PTS']/input_data['MP']

Et ensuite je concatène toute la série, quelle est la façon pythonique de faire ça? Comment puis-je faire cela en utilisant l'opération Map / lambda?

0
Dude 5 mars 2016 à 21:44

3 réponses

Meilleure réponse

IIUC vous pouvez utiliser:

print input_data
     MP   PTS   TRB  AST    FG%  BLK    3P%
0  2810   793   678  117  0.485   74  0.315
1   263   101    30   19  0.402    7  0.385
2  4241  1170  1178  144  0.548  201  0.000

input_data['A'] = input_data['PTS']/input_data['MP']
input_data['B'] = input_data['AST']/input_data['MP']
print input_data
     MP   PTS   TRB  AST    FG%  BLK    3P%         A         B
0  2810   793   678  117  0.485   74  0.315  0.282206  0.041637
1   263   101    30   19  0.402    7  0.385  0.384030  0.072243
2  4241  1170  1178  144  0.548  201  0.000  0.275878  0.033954

print pd.DataFrame({'A': input_data['A'],'B': input_data['B']}, index=input_data.index)
          A         B
0  0.282206  0.041637
1  0.384030  0.072243
2  0.275878  0.033954
1
jezrael 5 mars 2016 à 19:04

Divisez toutes les colonnes de la trame de données, sauf la première par la première colonne.

df.iloc[:, ].apply(lambda s: s / df.iloc[:, 0])
        PTS       TRB       AST       FG%       BLK       3P%
0  0.282206  0.241281  0.041637  0.000173  0.026335  0.000112
1  0.384030  0.114068  0.072243  0.001529  0.026616  0.001464
2  0.275878  0.277765  0.033954  0.000129  0.047394  0.000000

Cela fonctionne également:

df.iloc[:, 1:].div(df.iloc[:, 0].values, axis=0)

Je pense que vous devrez ensuite recalculer vos colonnes FG% et 3P%. Cela fera la division sur votre trame de données d'origine, laissant MP, FG% et 3P% intacts.

df.iloc[:, [1, 2, 3, 5]] = df.iloc[:, [1, 2, 3, 5]].div(df.iloc[:, 0].values, axis=0)

>>> df
     MP       PTS       TRB       AST    FG%       BLK    3P%
0  2810  0.282206  0.241281  0.041637  0.485  0.026335  0.315
1   263  0.384030  0.114068  0.072243  0.402  0.026616  0.385
2  4241  0.275878  0.277765  0.033954  0.548  0.047394  0.000

P.s. Allez les guerriers !!!

1
Alexander 5 mars 2016 à 19:33

Non, concaténer la nouvelle série est très idiomatique.

Vous pouvez également utiliser df['newcol'] = ... pour créer ce que vous voulez.

0
Mike Graham 5 mars 2016 à 18:47