You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在多列lambda函数中获取对应列最后一行的数值?

解决pandas DataFrame元素修正值计算问题

问题根源

你之前的代码用了axis=1,这时候lambda里的x是整行数据,x.values[-1]自然取的是该行最后一列(Ca)的值,而非对应元素列的最后一行(Seawater行)数值,处理方向完全搞反了。

正确实现代码

要实现你的修正公式,应该按列来处理(axis=0),这样lambda的参数是每一列的Series,就能轻松拿到该列的海水值,再结合每行的Mg值完成计算:

import pandas as pd

d = {'Site': ['A',' A',' B',' B',' C',' C',' Seawater'], 'Mg':[52, 48.6, 50.7, 51.0, 27.2, 25.6, 52.2], 'S':[27, 25, 27, 26, 14, 15, 27.6],'K':[9, 9, 9.4, 9.3, 13, 13, 9], 'Ca': [10, 9, 10.3, 10, 20, 21, 10]}
df = pd.DataFrame(data=d)

# 提取海水行的Mg值,作为计算分母的固定项
seawater_mg = df['Mg'].iloc[-1]
# 按列处理元素数据,计算修正值
new_df = df[['Mg','S','K','Ca']].apply(lambda col: (col - col.iloc[-1]) / (df['Mg'] + seawater_mg), axis=0)
# 合并Site列,保持和原DataFrame一致的结构
new_df = pd.concat([df['Site'], new_df], axis=1)

代码解释

  1. seawater_mg = df['Mg'].iloc[-1]:单独提取海水行的Mg值,避免重复计算
  2. axis=0:让apply遍历每一列,col代表当前元素列的所有行数据
  3. col.iloc[-1]:拿到当前元素列的最后一行(Seawater)数值,这正是你需要的基准值
  4. df['Mg'] + seawater_mg:利用pandas的广播特性,把每行的Mg值和海水Mg值相加,得到分母
  5. 最后用concat把Site列合并回去,保证输出结构和原数据一致

扩展适配

如果后续新增更多元素列,只要这些列都不属于Site列,就可以把代码里的固定列列表换成自动提取的元素列,无需手动修改:

# 自动提取所有非Site的元素列
element_cols = df.columns.drop('Site')
new_df = df[element_cols].apply(lambda col: (col - col.iloc[-1]) / (df['Mg'] + seawater_mg), axis=0)
new_df = pd.concat([df['Site'], new_df], axis=1)

内容的提问来源于stack exchange,提问作者Tom Giun

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 07:04:59