如何让DataFrame首行的NULL值通过interpolate方法填充?
解决PySpark转Pandas后首行NULL值无法线性插值的问题
Pandas的interpolate(method='linear')默认只在存在前后有效值的区间内做线性插值,首行的NULL因为没有前向参考值,所以会被跳过。要处理这个问题,你可以试试下面几种方案:
方案1:开启双向插值
直接给interpolate加上limit_direction='both'参数,让它支持从后往前插值补全首行缺失:
# 单列处理 pd_df['humedad_3'] = pd_df['humedad_3'].interpolate(method='linear', limit_direction='both') # 批量处理所有数值列 numeric_cols = pd_df.select_dtypes(include=['int64', 'float64']).columns pd_df[numeric_cols] = pd_df[numeric_cols].interpolate(method='linear', limit_direction='both')
这个参数会让插值逻辑同时覆盖向前和向后的缺失值,首行的NULL会直接取第一个非空值来填充(线性插值在只有一个参考值时,直接复用该值)。
方案2:单独补全首行再插值
如果不想全局开启双向插值,可以先单独处理首行的缺失,再执行常规插值:
# 用下一个非空值填充首行的humedad_3 pd_df.loc[pd_df.index[0], 'humedad_3'] = pd_df['humedad_3'].bfill().iloc[0] # 再处理其他位置的缺失值 pd_df['humedad_3'] = pd_df['humedad_3'].interpolate(method='linear')
bfill()会取当前位置之后的第一个非空值,这里只提取首行的填充结果,不会影响其他行的插值逻辑。
方案3:插值后兜底填充
如果你的数据是按时间或有序索引排列的,也可以先插值,再用前向填充补全剩余的首尾缺失:
pd_df['humedad_3'] = pd_df['humedad_3'].interpolate(method='linear').ffill()
先处理中间的线性插值,再用ffill()把首行剩下的NULL用后续的有效值补全。
注意:处理完Pandas DataFrame后,转回PySpark时要确认数据类型和原表一致,避免出现类型不兼容的问题。
内容的提问来源于stack exchange,提问作者Rirro Romeu
相关产品推荐
相关产品推荐

