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
Vous devez vous connecter pour publier un commentaire.
Ceci est une application de (et l'une des principales motivations pour l'utilisation de MultiIndex segments), voir docs ici
Puisque vous travaillez avec le 1er niveau des colonnes de l'index, ce qui suit fonctionnera aussi bien. L'exemple ci-dessus est plus générale, disons que vous avez voulu faire cela pour 'a'.
df['A']
etdf[['A']]
OriginalL'auteur Jeff