Оператор If / else внутри цикла над фреймом данных - PullRequest
2 голосов
/ 09 мая 2019

У меня есть датафрейм с тремя столбцами: Глубина, объем сланца и плотность.

Что мне нужно сделать, так это рассчитать пористость на основе объема и плотности сланца. Поэтому, когда объем сланца составляет> 0,7, я применяю определенные параметры для расчета пористости, а где у меня объем <0,2, у меня есть другие параметры. </p>

Например, если объем сланца <0,2: </p>

 porosity=density*2.3

и если объем сланца> 0,7:

 porosity=density*1.7

это пример части кадра данных, если есть:

 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

это кусок кода, который я пытаюсь сделать. Я хочу, чтобы он был в цикле for, потому что он будет служить для будущих целей:

 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)

Я получаю следующую ошибку: было бы замечательно, если бы вы могли мне помочь:

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

1 Ответ

2 голосов
/ 09 мая 2019

Здесь iterrows - плохой выбор, потому что медленное и существующее векторизованное решение, проверьте Есть ли у pandas iterrows проблемы с производительностью?

Так что используйте 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

Лучше также определено, что происходит между 0.2 and 0.7 - например, возвращаемое значение столбца data['density'] в параметре по умолчанию:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...