Supposons que j'ai un DataFrame multi-index comme celui-ci:

import numpy as np
import pandas as pd

ix = pd.MultiIndex.from_product([['bucket 1', 'bucket 2'], ['q1', 'q2', 'q3']])
col = ['col1', 'col2', 'col3']
df = pd.DataFrame(np.random.randn(6, 3), ix, col)

Production:

                 col1      col2      col3
bucket 1 q1  0.061384  0.364194 -1.502486
         q2  0.562352 -0.044836  0.242474
         q3  0.373411 -0.678429 -1.261984
bucket 2 q1  0.884109 -0.070899  0.085305
         q2 -0.010463  1.463259 -0.572882
         q3 -0.419821 -0.916151  0.032110

Maintenant, je crée une série avec l'index correspondant aux colonnes de mon DataFrame:

s = pd.Series([1,2,3], index=["col1", "col2", "col3"])

Je peux diviser les valeurs dans bucket 1 dans le DataFrame par la série comme ceci:

df.loc["bucket 1"].div(s)

Production:

    col1      col2      col3
q1  0.061384  0.182097 -0.500829
q2  0.562352 -0.022418  0.080825
q3  0.373411 -0.339214 -0.420661

Cependant, si j'essaie d'utiliser ce calcul pour définir les valeurs dans le DataFrame en utilisant .loc, il crée simplement des NaN:

df.loc["bucket 1"] = df.loc["bucket 1"].div(s)

Production:

                 col1      col2      col3
bucket 1 q1       NaN       NaN       NaN
         q2       NaN       NaN       NaN
         q3       NaN       NaN       NaN
bucket 2 q1  0.884109 -0.070899  0.085305
         q2 -0.010463  1.463259 -0.572882
         q3 -0.419821 -0.916151  0.032110

Qu'est-ce que je fais mal? Comment effectuer les calculs dans le DataFrame?

4
Toby Petty 11 mars 2019 à 19:47

2 réponses

Meilleure réponse

Utilisez simplement .values pour définir les valeurs:

df.loc["bucket 1"]=df.loc["bucket 1"].div(s).values
print(df)

                 col1      col2      col3
bucket 1 q1 -0.149856  0.220604 -0.048464
         q2 -0.791260 -0.199646  0.148115
         q3 -0.712257 -0.264074 -0.266497
bucket 2 q1 -1.120164 -0.290546  0.577589
         q2 -0.149522 -0.221203 -0.566872
         q3 -1.002036 -2.233220 -1.206849
3
anky 11 mars 2019 à 16:49

Il vous manque juste un []

df.loc[["bucket 1"]]=df.loc[["bucket 1"]].div(s)
df
Out[1092]: 
                 col1      col2      col3
bucket 1 q1 -1.016733 -1.334495  0.417621
         q2  0.892984 -0.329325  0.224591
         q3  1.438399 -0.094883  0.053133
bucket 2 q1 -0.062476  0.962616  0.457755
         q2  0.389670  1.238829  0.390253
         q3  0.713873 -0.034645 -0.148381
1
BENY 11 mars 2019 à 17:01