Pandas DataFrame应用自定义函数仅调用最后一行数据问题排查
问题分析与解决
你遇到的问题是用apply计算新变量时所有行结果完全相同,本质是函数调用和参数传递的错误,具体原因和修正方法如下:
错误原因
- 在
lambda x: new_vars(data)里,你把整个原始DataFramedata传给了new_vars,而非当前迭代的单行数据x new_vars函数里直接取dataframe.Temp和dataframe.Dewpt_Temp,这会返回整列的Series而非单行的单个值,最终计算出的是整列的运算结果,apply逐行返回时就重复了同一组值
修正方案(适配后续复杂行逻辑练习)
调整apply的参数传递,同时修改new_vars函数处理单行数据:
import pandas as pd data = pd.read_csv('file path/weather_data.csv') def new_vars(row): # 从单行数据中提取单个温度、露点温度值 temp = row['Temp'] dewpt = row['Dewpt_Temp'] e = 6.11 * (10 ** ((7.5 * dewpt) / (273.3 + dewpt))) e_s = 6.11 * (10 ** ((7.5 * temp) / (273.3 + temp))) rh = (e / e_s) * 100 # 返回Series,方便apply后直接转为DataFrame的列 return pd.Series([e, e_s, rh], index=['e', 'e_s', 'rh']) # 按行迭代处理数据 new_df = data.apply(lambda x: new_vars(x), axis=1) # 可选:将新变量合并到原始DataFrame result_df = pd.concat([data, new_df], axis=1)
更高效的向量化写法(Pandas官方推荐)
如果后续公式支持向量化运算,直接对整列计算会比逐行apply效率高很多,尤其适合大型数据集:
import pandas as pd data = pd.read_csv('file path/weather_data.csv') data['e'] = 6.11 * (10 ** ((7.5 * data['Dewpt_Temp']) / (273.3 + data['Dewpt_Temp']))) data['e_s'] = 6.11 * (10 ** ((7.5 * data['Temp']) / (273.3 + data['Temp']))) data['rh'] = (data['e'] / data['e_s']) * 100
内容的提问来源于stack exchange,提问作者matrix_season
相关产品推荐
相关产品推荐

