请帮助我提高代码的效率。这是我的df:
df = pd.DataFrame([['A', 80], ['A', 64], ['A', 55], ['B', 56], ['B', 89], ['B', 73], ['C', 78], ['C', 100], ['C', 150], ['C', 76], ['C', 87]], columns=['Well', 'GR'])
Well GR
A 80
A 64
A 55
B 56
B 89
B 73
C 78
C 100
C 150
C 76
C 87
请帮我找到Vshale。每口井的V页岩=GR-GR(最小(/GR(最大(-GR(最小(。这是我想要的结果:
Well GR Vshale
A 80 1
A 64 0.36
A 55 0
B 56 0
B 89 1
B 73 0.515151515
C 78 0.027027027
C 100 0.324324324
C 150 1
C 76 0
C 87 0.148648649
这段代码对我来说是可行的,但是,我应该创建一个由GRMax和GRMin组成的新列,并将其合并到我以前的df中。我正在寻找一种更有效的方法,而不在我原来的df上添加GRmin和GRmax。非常感谢。
df1 = df.groupby(['Well']).agg({'GR': ['min', 'max']}).reset_index()
df1.columns = list(map(''.join, df1.columns.values))
df2 = pd.merge (df, df1, on = 'Well', how = 'left')
df2['Vshale'] = (df2['GR'] - df2['GRmin'])/(df2['GRmax'] - df2['GRmin'])
具有方法转换的单字符串解决方案:
df['Vshale'] = df.groupby('Well').transform(lambda x: (x - np.min(x))/(np.max(x) - np.min(x)))
试试这个:
df=pd.DataFrame([['A', 80], ['A', 64], ['A', 55], ['B', 56], ['B', 89], ['B', 73], ['C', 78], ['C', 100], ['C', 150], ['C', 76], ['C', 87]], columns=['Well', 'GR'])
a=[]
for i in np.unique(df['Well']):
x=pd.DataFrame(df['GR']-df['GR'][df['Well']==i].min())/(df['GR'][df['Well']==i].max()-df['GR'][df['Well']==i].min() )
x['Well']=i
x=x[df['Well']==i]
a.append(x)
gr=pd.concat(a)
df['Vshale']=gr['GR']
输出:
df
Out[53]:
Well GR Vshale
0 A 80 1.000000
1 A 64 0.360000
2 A 55 0.000000
3 B 56 0.000000
4 B 89 1.000000
5 B 73 0.515152
6 C 78 0.027027
7 C 100 0.324324
8 C 150 1.000000
9 C 76 0.000000
10 C 87 0.148649
说明:
- 创建一个空列表
a
- 使用
for
循环实现Well
所有唯一值的逻辑 - 应用公式并将结果存储在
x
中(请注意,每次迭代此循环时,公式都会应用于Wells
的所有值,因此需要执行下一步操作( - 通过索引,将
x
减少为仅具有该特定Well
值的值 - 将该
x
附加到初始化列表a
- 现在只需连接列表中的数据帧,并将这些值分配给原始数据帧