如何更高效复制pandas DataFrame并添加取值不同的新列
你原来的写法逻辑正确可正常运行,只是当原表数据量较大时,两次全表复制会带来不必要的内存开销,下面是两种更高效的实现方案:
方案1:行重复+直接赋值(性能最优)
无需多次复制全表,先将每行重复2次后直接给新列赋值,内存开销最低,适合大表场景:
import pandas as pd import numpy as np from datetime import datetime # 原始DataFrame构造 d = {'account_id': [1, 2], 'type': ['a', 'b']} df = pd.DataFrame(data=d) # 高效实现逻辑 df = df.loc[df.index.repeat(2)].reset_index(drop=True) df['include_images'] = [True, False] * (len(df) // 2) df['data_since'] = np.where(df['include_images'], datetime(2018,1,1), pd.NaT)
方案2:交叉合并(可读性+扩展性最优)
如果后续可能新增更多配置规则,建议用配置表交叉合并的写法,代码逻辑更清晰,修改规则只需要调整配置表即可:
# 构造配置表,后续新增规则只需要修改这部分 config_df = pd.DataFrame({ 'include_images': [True, False], 'data_since': [datetime(2018,1,1), pd.NaT] }) # pandas 1.2.0及以上版本支持how='cross' df = df.merge(config_df, how='cross') # 低版本pandas兼容写法 # df['tmp'] = 1 # config_df['tmp'] = 1 # df = df.merge(config_df, on='tmp').drop('tmp', axis=1)
两种方案最终输出的结果和你现有实现完全一致。
内容的提问来源于stack exchange,提问作者BioGeek
相关产品推荐
相关产品推荐

