在数据帧循环内的if / else语句

时间:2019-05-09 13:34:12

标签: python pandas numpy dataframe

我有一个包含三列的数据框: 深度,页岩体积和密度。

我需要做的是根据页岩的体积和密度计算孔隙度。因此,在页岩体积> 0.7的情况下,我将某些参数应用于孔隙度计算,而在我的体积<0.2的情况下,我将使用其他参数。

例如,如果页岩体积<0.2:

 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 个答案:

答案 0 :(得分:2)

这里iterrows是错误的选择,因为速度慢且存在矢量化解决方案,请检查Does pandas iterrows have performance issues?

因此,请使用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