Pandas : la Bonne façon de définir des valeurs basées sur la condition de sous-ensemble de multiindex dataframe

Je ne suis pas sûr de la façon de le faire sans enchaîné les affectations (qui probablement ne fonctionnera pas de toute façon parce que je serais en paramètre une copie).

Je wan pas à prendre un sous-ensemble d'un multiindex pandas dataframe, test pour les valeurs inférieures à zéro et de les mettre à zéro.

Par exemple:

df = pd.DataFrame({('A','a'): [-1,-1,0,10,12],
                   ('A','b'): [0,1,2,3,-1],
                   ('B','a'): [-20,-10,0,10,20],
                   ('B','b'): [-200,-100,0,100,200]})

df[df['A']<0] = 0.0

donne

In [37]:

df

Out[37]:
    A   B
    a   b   a   b
0   -1  0   -20 -200
1   -1  1   -10 -100
2   0   2   0   0
3   10  3   10  100
4   12  -1  20  200

Qui montre qu'il n'a pas été en mesure de définir en fonction de l'état. Sinon, si j'ai fait une enchaîné affectation:

df.loc[:,'A'][df['A']<0] = 0.0

Cela donne le même résultat (et la définition de la copie d'avertissement)

J'ai pu parcourir chaque colonne en fonction de la condition que le premier niveau est celui que je veux:

for one,two in df.columns.values:
    if one == 'A':
        df.loc[df[(one,two)]<0, (one,two)] = 0.0

qui donne le résultat souhaité:

In [64]:

df

Out[64]:
    A   B
    a   b   a   b
0   0   0   -20 -200
1   0   1   -10 -100
2   0   2   0   0
3   10  3   10  100
4   12  0   20  200

Mais de toute façon je sens qu'il y a de mieux pour ce faire qu'en parcourant les colonnes. Quel est le meilleur moyen de le faire dans les pandas?

OriginalL'auteur pbreach | 2015-01-17