基于DataFrame的y列范围值保留对应d列单行唯一有效值
问题描述
现有如下DataFrame:
x y1 y2 y3 y4 d1 d2 d3 d4 0 -17.7 7 NaN NaN NaN 5 NaN 4 NaN 1 -15.0 NaN NaN NaN 3 4 NaN NaN 8 2 -12.5 NaN NaN 2 NaN NaN NaN 1 9
需求:基于y1至y4列的有效值位置,将d1至d4列每行仅保留对应位置的值,其余值设为NaN。例如第一行y1有有效值,因此仅保留d1的值,其余d列设为NaN,最终期望输出:
x y1 y2 y3 y4 d1 d2 d3 d4 0 -17.7 7 NaN NaN NaN 5 NaN NaN NaN 1 -15.0 NaN NaN NaN 3 NaN NaN NaN 8 2 -12.5 NaN NaN 2 NaN NaN NaN 1 NaN
解决方案
使用Pandas的where()方法结合布尔掩码即可实现需求,具体代码如下:
import pandas as pd # 构造原始DataFrame df = pd.DataFrame({ 'x': [-17.7, -15.0, -12.5], 'y1': [7, None, None], 'y2': [None, None, None], 'y3': [None, None, 2], 'y4': [None, 3, None], 'd1': [5, 4, None], 'd2': [None, None, None], 'd3': [4, None, 1], 'd4': [None, 8, 9] }) # 定义y列和d列的列名集合 y_cols = ['y1', 'y2', 'y3', 'y4'] d_cols = ['d1', 'd2', 'd3', 'd4'] # 生成掩码:标记y列中存在有效值的位置 mask = df[y_cols].notna() # 用掩码过滤d列,仅保留对应位置的值,其余设为NaN df[d_cols] = df[d_cols].where(mask) print(df)
代码说明
df[y_cols].notna():生成与y列结构一致的布尔DataFrame,True表示对应y列位置有有效值,False表示为NaNdf[d_cols].where(mask):对d列应用掩码,仅保留掩码为True位置的原值,其他位置替换为NaN- 最后将处理后的d列赋值回原DataFrame,完成数据更新
内容的提问来源于stack exchange,提问作者Peter M
相关产品推荐
相关产品推荐

