2017-10-18 3 views
2

La sortie ressemble plus à l'instruction SQL suivante.Comment mettre à jour une colonne avec plusieurs conditions en prenant une valeur correspondante d'une autre colonne Python Pandas

UPDATE table_A SET final=(cs+fhfa+sz)/3 WHERE cs IS NOT NULL AND fhfa IS NOT NULL AND sz IS NOT NULL; 

ici cs + FHFA + sz sont toutes les colonnes individuelles dans la table SQL (et dataframe)

Si je veux convertir cette instruction SQL pour pandas opération en python, ce sera plus comme:

df['div_3'] = (df.cs+df.fhfa+df.sz) /3 
    df['final'] = df.loc[(df['cs'] != None) & (df['fhfa'] != None) & (df['sz'] != None) ] = df['div_3'] 

Mais cela ne garantit pas que les "valeurs correspondantes" soient finalement mises. Comment y parvenir?

Ai-je vraiment besoin de créer une autre colonne div_3 avec toute la somme de 3 colonnes? Cela peut-il être fait sans une autre création de colonne?

Répondre

3

Filtrer sur pd.Series.notnull et appeler mean.

c = ['cs', 'fhfa', 'sz'] 
df['final'] = df[df[c].notnull().all(1)][c].mean(1) 
2

IIUC:

df.loc[:, 'final'] = df.loc[df[['cs','fhfa','sz']].notnull().all(1), ['cs','fhfa','sz']].sum(1)/3 

.all(1) - est le même que .all(axis=1), ce qui signifie que - toutes les valeurs dans chaque rangée doivent être True

+1

Je pense que c'est méchant. –

+0

@ cᴏʟᴅsᴘᴇᴇᴅ, ouais, je l'ai remarqué maintenant. Mais si je voudrais l'utiliser - ce serait trop similaire à votre réponse ... ;-) – MaxU

+0

Aha, pas de problème. Vous avez trouvé un autre moyen et avez toujours trouvé la réponse, comme toujours. –