如何处理Pandas DataFrame中的NA值?附待优化代码
Pandas代码修改:处理NA值并按列独立生成输出
原代码存在两个问题:一是无法处理输入中的NA值,二是逻辑错误——仅依据Delivery Time zone overlap列的值就给所有三组输出列赋值,不符合"每个输入列对应三个输出列"的需求。以下是修正后的代码,同时满足NA值处理要求:
测试数据(含NA值)
import pandas as pd import numpy as np # 构造带NA值的输入DataFrame delivery_df = pd.DataFrame({ 'Delivery Time zone overlap': [3, np.nan, 11.5, 3, 0, 9.5], 'Developer & Product Time zone overlap': [np.nan, 3, 11.5, 3, 0, 9.5], 'Developer & Agile champion Time zone overlap': [3, 3, np.nan, 3, 0, 9.5] })
修正后的代码
def process_overlap_column(col_name, df): """处理单个输入列,生成对应的三个输出列""" col_values = df[col_name] base_name = col_name.replace(' Time zone overlap', '') # 初始化三个输出列,默认设为NA colocation_col = f'{base_name} colocation' overlap_col = f'{base_name} overlap' opposite_col = f'{base_name} opposite timezone' # 创建结果字典 result = pd.DataFrame({ colocation_col: np.nan, overlap_col: np.nan, opposite_col: np.nan }, index=df.index) # 处理非NA值的情况 mask_not_na = col_values.notna() # 条件判断:colocation(值为0) mask_coloc = (col_values == 0) & mask_not_na result.loc[mask_coloc, colocation_col] = f'{base_name} is colocated' # 条件判断:overlap(1-5.5之间) mask_overlap = (col_values.between(1, 5.5)) & mask_not_na result.loc[mask_overlap, overlap_col] = f'{base_name} has overlap' # 条件判断:opposite timezone(大于5.5) mask_opposite = (col_values > 5.5) & mask_not_na result.loc[mask_opposite, opposite_col] = f'{base_name} in opposite timezone' return result # 处理所有输入列,合并结果 output_dfs = [] for col in delivery_df.columns: output_dfs.append(process_overlap_column(col, delivery_df)) output_df = pd.concat(output_dfs, axis=1) # 打印结果 print(output_df)
关键修改说明
- 按列独立处理:每个输入列单独生成对应的三个输出列,不再依赖单一列的值批量赋值
- NA值处理:所有输出列初始化为NA,仅当输入列非NA时,根据值的范围填充对应输出列;若输入列是NA,对应的三个输出列保持NA
- 高效操作:使用Pandas的向量化方法(
loc、notna、between)替代iterrows和append,提升运行效率 - 语法修正:原代码中"Developer & Product has overlap"的表述不符合语法,已统一调整为正确的表述逻辑
内容的提问来源于stack exchange,提问作者Leo82
相关产品推荐
相关产品推荐

