如何用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:
- 将两个DataFrame的匹配条件列(对应原问题的
P/N和Operation)设为多级索引,让pandas自动对齐行 - 调用
df1.update(df2, overwrite=False):仅用df2中对应位置的值填充df1的NaN,已有有效值保持不变 - 最后重置索引恢复原数据结构
优化细节
如果仅需要填充特定列(比如原问题的Time列),可先从df2中提取目标列再执行更新,减少内存占用:
# 仅提取df2中的Time列用于填充 df1.update(df2[['Time']], overwrite=False)
这种方式在大数据量场景下效率远高于循环遍历或合并操作,能有效避免内存溢出问题。
内容的提问来源于stack exchange,提问作者PartonSwift
相关产品推荐
相关产品推荐

