如何在不修改原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) )
错误写法的原因解析
- 第一种错误写法:
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也被修改,完全不符合需求。
- 第二种错误写法:
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
相关产品推荐
相关产品推荐

