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

如何重构DataFrame:填充NaN并合并行得到name与color目标列

解决方案

核心思路

先按sql_Key分组,把同组内updated_name/updated_color的非空值填充到组内所有空值位置;再用填充后的updated列和original列做「优先取前者,空值取后者」的合并,最终提取出name和color列。

完整代码

import pandas as pd
import numpy as np

# 示例输入DataFrame
data = {
    'sql_Key': [1,1,2,3,3],
    'updated_name': ['Alice', np.nan, np.nan, 'Dave', np.nan],
    'updated_color': [np.nan, 'Blue', np.nan, 'Black', np.nan],
    'original_name': ['Alice_old', 'Bob_old', 'Charlie_old', 'Dave_old', 'Eve_old'],
    'original_color': ['Red_old', 'Green_old', 'Yellow_old', 'White_old', 'Gray_old']
}
df = pd.DataFrame(data)

# 步骤1:按sql_Key分组,填充组内updated列的空值
# ffill() + bfill()确保组内只要有非空值,所有空值都会被填充
df['filled_updated_name'] = df.groupby('sql_Key')['updated_name'].transform(lambda x: x.ffill().bfill())
df['filled_updated_color'] = df.groupby('sql_Key')['updated_color'].transform(lambda x: x.ffill().bfill())

# 步骤2:生成最终的name和color列,优先用填充后的updated列,否则用original列
df['name'] = df['filled_updated_name'].combine_first(df['original_name'])
df['color'] = df['filled_updated_color'].combine_first(df['original_color'])

# 步骤3:提取目标列(不需要sql_Key的话可删除该列)
result = df[['sql_Key', 'name', 'color']]
print(result)

代码说明

  1. 分组填充:groupby('sql_Key').transform()会对每个分组单独处理,ffill().bfill()组合可以处理组内非空值在任意位置的情况——先向前填充,再向后填充,确保组内所有空值都被同组的非空updated值覆盖;如果组内updated列全空,填充后依然是NaN,为后续取original值留好口子。
  2. 合并优先级:combine_first()方法天然实现「优先取调用方的值,若为空则取传入参数的值」的逻辑,比嵌套np.where更简洁直观。
  3. 结果输出:示例运行后会得到你期望的结果,若不需要保留sql_Key,直接提取['name', 'color']即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 11:12:44