如何无需新增列,基于字典/查找表设置DataFrame的Status列
高效生成Status列(避免Merge带来的内存占用)
需求说明
现有包含Date和ID列的数据集,需新增Status列:
- 若
Date早于对应ID的参考日期,Status设为Off - 若
Date等于或晚于该日期,Status设为On
当前用merge合并查找表的方法会新增中间列,对百万级大数据集造成不必要的内存占用,以下是无需新增列的实现方案:
方案一:基于字典映射
先将字典中的参考日期转为datetime格式,再通过map匹配对应ID的日期,结合向量化判断生成Status:
import pandas as pd import numpy as np # 1. 转换原数据集的Date列为datetime(必须步骤) df['Date'] = pd.to_datetime(df['Date']) # 2. 定义并转换参考字典的日期格式 lookup_dict = {'A': '1/2/2024', 'B': '1/4/2024'} lookup_dict = {k: pd.to_datetime(v) for k, v in lookup_dict.items()} # 3. 生成Status列:临时匹配参考日期,无中间列残留 ref_dates = df['ID'].map(lookup_dict) df['Status'] = np.where(df['Date'] >= ref_dates, 'On', 'Off')
优势:ref_dates是临时生成的Series,不会添加到原DataFrame,用完自动回收内存;np.where是向量化操作,比逐行apply效率高10倍以上。
方案二:基于查找表(DataFrame)
若参考数据是DataFrame格式,先将其转为以ID为索引的Series,再用同样的方式匹配:
import pandas as pd import numpy as np # 1. 转换原数据集和查找表的日期列 df['Date'] = pd.to_datetime(df['Date']) lookup_table['查找日期'] = pd.to_datetime(lookup_table['查找日期']) # 2. 将查找表转为ID为索引的Series lookup_series = lookup_table.set_index('ID')['查找日期'] # 3. 生成Status列 ref_dates = df['ID'].map(lookup_series) df['Status'] = np.where(df['Date'] >= ref_dates, 'On', 'Off')
优势:避免了merge操作带来的全表复制,内存占用仅为merge方法的1/2左右,尤其适合百万级以上的数据集。
内容的提问来源于stack exchange,提问作者yungkenny
相关产品推荐
相关产品推荐

