You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于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表示为NaN
  • df[d_cols].where(mask):对d列应用掩码,仅保留掩码为True位置的原值,其他位置替换为NaN
  • 最后将处理后的d列赋值回原DataFrame,完成数据更新

内容的提问来源于stack exchange,提问作者Peter M

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 06:01:07