web-dev-qa-db-fra.com

pandas plusieurs conditions basées sur plusieurs colonnes utilisant np.where

J'essaie de colorer les points d'une trame de données pandas dépend de DEUX conditions. Exemple:

Si valeur de col1> a (flottant) ET valeur de col2- valeur de col3 <b (flottant), alors valeur de col 4 = chaîne, sinon: autre chaîne.

J'ai essayé tellement de façons différentes maintenant et tout ce que j'ai trouvé en ligne ne dépendait que d'une seule condition.

Mon exemple de code soulève toujours l'erreur: la valeur de vérité d'une série est ambiguë. Utilisez a.empty, a.bool (), a.item (), a.any () ou a.all ().

Voici le code. J'ai essayé plusieurs variantes sans succès.

df = pd.DataFrame()

df['A'] = range(10)
df['B'] = range(11,21,1)
df['C'] = range(20,10,-1)

borderE = 3.
ex = 0.

#print df

df['color'] = np.where(all([df.A < borderE, df.B - df.C < ex]), 'r', 'b')

Btw: Je comprends, ce qu'il dit mais pas comment le gérer ... Merci d'avance!

10
Robert

Les critères de sélection utilisent indexation booléenne :

df['color'] = np.where(((df.A < borderE) & ((df.B - df.C) < ex)), 'r', 'b')

>>> df
   A   B   C color
0  0  11  20     r
1  1  12  19     r
2  2  13  18     r
3  3  14  17     b
4  4  15  16     b
5  5  16  15     b
6  6  17  14     b
7  7  18  13     b
8  8  19  12     b
9  9  20  11     b
16
Alexander

envelopper l'IF dans une fonction et l'appliquer:

def color(row):
    borderE = 3.
    ex = 0.
    if (row.A > borderE) and( row.B - row.C < ex) :
        return "somestring"
    else:
        return "otherstring"

df.loc[:, 'color'] = df.apply(color, axis = 1)

Rendements:

  A   B   C        color
0  0  11  20  otherstring
1  1  12  19  otherstring
2  2  13  18  otherstring
3  3  14  17  otherstring
4  4  15  16   somestring
5  5  16  15  otherstring
6  6  17  14  otherstring
7  7  18  13  otherstring
8  8  19  12  otherstring
9  9  20  11  otherstring
6
Sam