我有一个包含三列的数据框: 深度,页岩体积和密度。
我需要做的是根据页岩的体积和密度计算孔隙度。因此,在页岩体积> 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'
答案 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