如何重构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)
代码说明
- 分组填充:
groupby('sql_Key').transform()会对每个分组单独处理,ffill().bfill()组合可以处理组内非空值在任意位置的情况——先向前填充,再向后填充,确保组内所有空值都被同组的非空updated值覆盖;如果组内updated列全空,填充后依然是NaN,为后续取original值留好口子。 - 合并优先级:
combine_first()方法天然实现「优先取调用方的值,若为空则取传入参数的值」的逻辑,比嵌套np.where更简洁直观。 - 结果输出:示例运行后会得到你期望的结果,若不需要保留
sql_Key,直接提取['name', 'color']即可。
内容的提问来源于stack exchange,提问作者Python_Learner
相关产品推荐
相关产品推荐

