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

如何在不修改原DataFrame前提下生成含新列的独立DataFrame?

解决方法:生成含新列的独立DataFrame且不修改原数据

正确实现方式

方式1:通过深拷贝创建独立副本

先对原DataFrame做深拷贝,再在副本上添加新列,彻底隔离原数据:

import pandas as pd

input_df = pd.read_csv('input.csv')

def folder_column(row):
    if row['dwelling'] == 5 and row['wall'] == 2:
        return 'folder1'
    elif row['dwelling'] == 3 and row['wall'] == 4:
        return 'folder2'
    else:
        return 0

# 创建原DataFrame的深拷贝,生成独立对象
temp_df = input_df.copy()
# 在副本上添加新列,原input_df不受影响
temp_df['archetype_folder'] = temp_df.apply(folder_column, axis=1)

方式2:使用assign()方法(更简洁)

assign()方法会返回一个包含新列的新DataFrame,原数据保持不变:

temp_df = input_df.assign(
    archetype_folder=input_df.apply(folder_column, axis=1)
)

错误写法的原因解析

  1. 第一种错误写法:
temp_df = pd.DataFrame()
temp_df = input_df['archetype_folder'] = input_df.apply(folder_column, axis=1)

这是链式赋值操作:首先给input_df新增了archetype_folder列,然后把这个新列的Series对象赋值给temp_df,导致temp_df仅包含这一列,同时原input_df也被修改,完全不符合需求。

  1. 第二种错误写法:
temp_df = input_df
temp_df['archetype_folder'] = temp_df.apply(folder_column, axis=1)

temp_df = input_df只是让变量temp_df指向原DataFrame的内存地址,并未创建新对象。因此对temp_df的修改会直接同步到input_df上,两者本质是同一个数据。


性能优化建议(可选)

对于大数据集,apply()方法效率较低,推荐使用numpy.select()替代:

import pandas as pd
import numpy as np

input_df = pd.read_csv('input.csv')

# 定义条件列表和对应结果
conditions = [
    (input_df['dwelling'] == 5) & (input_df['wall'] == 2),
    (input_df['dwelling'] == 3) & (input_df['wall'] == 4)
]
choices = ['folder1', 'folder2']

# 生成新DataFrame
temp_df = input_df.copy()
temp_df['archetype_folder'] = np.select(conditions, choices, default=0)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 18:05:18