如何在多列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)
代码解释
seawater_mg = df['Mg'].iloc[-1]:单独提取海水行的Mg值,避免重复计算axis=0:让apply遍历每一列,col代表当前元素列的所有行数据col.iloc[-1]:拿到当前元素列的最后一行(Seawater)数值,这正是你需要的基准值df['Mg'] + seawater_mg:利用pandas的广播特性,把每行的Mg值和海水Mg值相加,得到分母- 最后用
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
相关产品推荐
相关产品推荐

