如何避免修改Pandas DataFrame子集的列表时改动原DataFrame
如何避免修改Pandas DataFrame子集的列表时改动原DataFrame
这问题我之前也碰到过!核心原因其实是Python里列表的特性——它是可变对象,你从DataFrame里取出来的col_2_list根本不是新列表,只是原DataFrame里列表的一个“引用”,相当于你和原df共用同一个列表,改了自然两边都变。
要解决这个问题,关键就是拿到列表的副本而非引用,下面给你两种实用的方法:
方法一:循环时复制列表(直观易懂)
在取出col_2的列表时,直接复制一份新的列表,这样后续的修改就只作用在新列表上,完全不影响原DataFrame。复制列表可以用两种方式:
- 用
list()构造函数 - 用切片语法
[:]
修改后的完整代码如下:
import pandas as pd dict_for_df = { "col_1": ["A", "B", "C"], "col_2": [["D", "E"], ["F", "H"], ["I", "J"]], } df = pd.DataFrame(dict_for_df) # 用来保存处理后的列表,方便后续使用 processed_lists = [] for i in range(df.shape[0]): col_1_value = df["col_1"][i] # 复制列表,生成独立的新列表 col_2_list = list(df["col_2"][i]) # 也可以写成 df["col_2"][i][:] col_2_list.insert(0, col_1_value) processed_lists.append(col_2_list) # 原DataFrame完全没被改动 print("原DataFrame:") print(df) # 处理后的列表可以单独使用 print("\n处理后的列表:") print(processed_lists)
方法二:用Pandas矢量化操作(高效优雅)
如果你的数据量较大,循环效率会比较低,推荐用apply函数来批量处理,全程不修改原DataFrame,直接生成新的结果列表:
import pandas as pd dict_for_df = { "col_1": ["A", "B", "C"], "col_2": [["D", "E"], ["F", "H"], ["I", "J"]], } df = pd.DataFrame(dict_for_df) # 用apply生成处理后的列表,原df不受影响 processed_lists = df.apply(lambda row: [row['col_1']] + row['col_2'], axis=1).tolist() # 查看原df,还是初始状态 print(df) # 查看处理后的列表 print(processed_lists)
这样不管用哪种方法,你都能保留原DataFrame的完整性,同时拿到可以后续使用的处理后列表啦~
备注:内容来源于stack exchange,提问作者Artem
相关产品推荐
相关产品推荐

