2 votes

Instruction If/else dans une boucle sur un cadre de données

J'ai un cadre de données avec trois colonnes : Profondeur, Volume de schiste et Densité.

Ce que je dois faire, c'est calculer la porosité en fonction du volume et de la densité du schiste. Ainsi, lorsque le volume du schiste est >0,7, j'applique certains paramètres pour le calcul de la porosité et lorsque le volume est <0,2, j'applique d'autres paramètres.

Par exemple, si le volume de schiste est < 0,2 :

 porosity=density*2.3

et si le volume de schiste est >0,7 :

 porosity=density*1.7

Voici l'exemple de la partie du cadre de données que nous avons :

 depth       density    VSH
 5517        2.126      0.8347083
 5517.5      2.123      0.8310949
 5518        2.124      0.8012414
 5518.5      2.121      0.7838615
 5519        2.116      0.7674243
 5519.5      2.127      0.8405414

Voici le morceau de code que j'essaie de faire. Je veux qu'il soit dans une boucle for parce qu'il servira à des fins futures :

 for index, row in data.iterrows():
     if data.loc[index, 'VSH']<0.2:
          data.loc[index,'porosity']=(data['density']*2.3)
     elif data.loc[index, 'VSH'] > 0.7:
          data.loc[index,'porosity']=(data['density']*1.7)

L'erreur que j'obtiens est la suivante, ce serait formidable si vous pouviez me fournir de l'aide :

 TypeError: '<' not supported between instances of 'str' and 'float'

2voto

jezrael Points 290608

Ici iterrows est un mauvais choix, parce que lent et existe solution vectorisée, vérifier Les iterrows de pandas ont-ils des problèmes de performance ?

Alors, utilisez numpy.select :

m1 = data['VSH'] < 0.2
m2 = data['VSH'] > 0.7
s1 = data['density']*2.3
s2 = data['density']*1.7

data['porosity'] = np.select([m1, m2], [s1, s2])

print (data)
    depth  density       VSH  porosity
0  5517.0    2.126  0.834708    3.6142
1  5517.5    2.123  0.831095    3.6091
2  5518.0    2.124  0.801241    3.6108
3  5518.5    2.121  0.783861    3.6057
4  5519.0    2.116  0.767424    3.5972
5  5519.5    2.127  0.840541    3.6159

Le mieux est aussi défini, ce qui se passe entre 0.2 and 0.7 - par exemple, la valeur retournée de la colonne data['density'] dans le paramètre par défaut :

data['porosity'] = np.select([m1, m2], [s1, s2], default=data['density'])

print (data)
    depth  density       VSH  porosity
0  5517.0    2.126  0.834708    3.6142
1  5517.5    2.123  0.831095    3.6091
2  5518.0    2.124  0.801241    3.6108
3  5518.5    2.121  0.783861    3.6057
4  5519.0    2.116  0.767424    3.5972
5  5519.5    2.127  0.840541    3.6159

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X