简单的计算表。请帮助我使我的代码更有效

2024-09-22 14:26:06 发布

您现在位置:Python中文网/ 问答频道 /正文

请帮助我使我的代码更有效。这是我的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=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'])


Tags: columns代码dataframedfpddf1df2well
2条回答

试试这个:

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
  • 现在只需在列表中连接数据帧,并将这些值分配给原始数据帧

使用方法transform的单字符串解决方案:

df['Vshale'] = df.groupby('Well').transform(lambda x: (x - np.min(x))/(np.max(x) - np.min(x)))

相关问题 更多 >