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

如何用df2作为查找表替换df1中基于P/N和Operation的NaN值?

用df2按条件填充df1的NaN值(大数据量场景)

问题描述

我需要用df2中的值替换df1里Time列的NaN值,替换规则是根据P/N和Operation两个条件在df2中匹配对应值。目前已实现:

  • 筛选df1中Time列NaN的行:
    df1 = df1.loc[df1['Time'].isnull()]
    
  • 在df2中按条件匹配对应Time值:
    df2 = df2.loc[(df2['P/N'] == pn) & (df2['Operation'] == op), 'Time']
    

但两个DataFrame数据量过大无法合并,且需保持独立,想知道如何用df2作为查找表填充df1的Time列NaN值。


补充测试代码(用于排查问题)

感谢Naveed的帮助,附上测试用代码:

import pandas as pd
import numpy as np

# 构建测试df1
df1 = pd.DataFrame(
    np.array([
        ['10/25/2022', 'Apple', 'Wash','Joe','Washer','EA', 100, 100, 0, 0.25, 1.1, 90.91, 55],
        ['10/25/2022', 'Apple', 'Peel','Tom','Peeler','EA', 100, 95, 5, 0.25, 1.30, 73.08, pd.NA],
        ['10/25/2022', 'Apple', 'Package','Sally','Packing','EA', 95, 95, 0, 0.8, 5.0, 19.00, pd.NA],
        ['10/25/2022','Orange', 'Wash', 'Joe','Washer','EA', 100, 100, 0, 0.25, 1.1, 90.91, pd.NA],
        ['10/25/2022','Orange', 'Peel','Tom','Peeler','EA', 95, 95, 5, 0.25, 2.30, 41.30, pd.NA],
        ['10/25/2022', 'Orange', 'Package','Sally','Packing','EA', 95, 95, 0, 1.1, 5.30, 17.92, pd.NA],
        ['10/25/2022','Banana', 'Peel & Eat','Tom','Peeler','EA', 100, 100, 0, 0.25, 1.1, 90.91, pd.NA]
    ]),
    columns=['date', 'fruit', 'operation', 'operator', 'station', 'uom', 'pcs_processed', 'pcs_accepted',
             'pcs_reject', 'setup', 'runtime', 'actual', 'target']
)

# 构建测试df2
df2 = pd.DataFrame(
    np.array([
        ['Apple', 'Wash', 'EA', 0.25, 0.25, 96],
        ['Apple', 'Peel', 'EA', 0.33, 0.1, 11.63],
        ['Apple', 'Slice', 'EA', 1.25, 0.25,32],
        ['Apple', 'Package', 'EA', 2.0, 1.0, 16.0],
        ['Orange', 'Wash', 'EA', 0.25, 0.25, 96.0],
        ['Orange','Peel', 'EA', 1.0, 0.1, 43.64],
        ['Orange', 'Slice','EA', 0.25, 0.25, 96.0],
        ['Orange', 'Package', 'EA', 2.0, 1.0, 16.0],
        ['Banana', 'Peel', 'EA', 0.5, 0.25, 64.0],
        ['Banana', 'Slice', 'EA', 1.10, 0.25, 35.56],
        ['Banana', 'Package', 'EA', 1.50, 1.00, 19.20],
        ['Banana', 'Peel & Eat', 'EA', 2.0, 3.0, 22],
        ['Pear', 'Peel & Eat', 'EA', 1.3, 0.25, 6.5]
    ]),
    columns=['fruit', 'operation', 'uom', 'cycle_time', 'chng_time', 'target']
)

# 设置多级索引(匹配条件列)
df1.set_index(['fruit','operation'], inplace=True)
df2.set_index(['fruit','operation'], inplace=True)

# 用df2的值更新df1的NaN,仅填充空值不覆盖已有数据
df1.update(df2, overwrite=False)

# 重置索引恢复原结构
df1 = df1.reset_index()
df2 = df2.reset_index()

解决方案说明

核心实现逻辑

通过多级索引对齐+update()方法实现高效填充,无需合并DataFrame,精准匹配条件且仅填充NaN:

  1. 将两个DataFrame的匹配条件列(对应原问题的P/N和Operation)设为多级索引,让pandas自动对齐行
  2. 调用df1.update(df2, overwrite=False):仅用df2中对应位置的值填充df1的NaN,已有有效值保持不变
  3. 最后重置索引恢复原数据结构

优化细节

如果仅需要填充特定列(比如原问题的Time列),可先从df2中提取目标列再执行更新,减少内存占用:

# 仅提取df2中的Time列用于填充
df1.update(df2[['Time']], overwrite=False)

这种方式在大数据量场景下效率远高于循环遍历或合并操作,能有效避免内存溢出问题。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 11:35:25